我在tkinter窗口中运行Python3.5和Psycopg2 2.6。 我在名为backend.py
的文件中有此功能Pane
我有这个代码的frontend.py。
import psycopg2
def search(year=0, month=0):
'''Search the database for entries.'''
conn = psycopg2.connect("dbname='birth_years'")
cur = conn.cursor()
cur.execute("SELECT * FROM birthdays WHERE year=year OR month=month;")
row = cur.fetchone()
conn.close()
return row
数据库:
from tkinter import *
import backend
def search_command(year, month):
'''Run queries on the database.'''
listbox1.delete(0, END)
row = backend.search(year_text.get(), month_text.get())
listbox1.insert(END, row)
window = Tk()
window.wm_title("Birthdays")
window.resizable(width=False, height=False)
Grid.rowconfigure(window, 0, weight=1)
Grid.columnconfigure(window, 0, weight=1)
b1 = Button(window, text="Search", width=15, command=search_command)
b1.grid(row=2, column=5)
window.mainloop()
postgresql数据库包含此数据。 PGAdmin2能够正常运行查询并仅选择我想要的行。当我使用我在数据库的第一行中获得的函数运行1988年的查询时。
id year month
1 1999 2
2 2005 5
3 1987 11
4 1988 12
5 1978 10
答案 0 :(得分:0)
我认为这是一个逻辑错误,但我无法专门测试以确定。
您的查询目前是:
cur.execute("SELECT * FROM birthdays WHERE year=year OR month=month;")
row = cur.fetchone()
这有两个问题:
fetchone()
代替fetchall()
,因此很清楚您只会得到一个结果;这就是你所要求的。year
值都等于year
中的值(您要求每个值将自身与自身进行比较),这意味着您的查询总是如此所有行都为True
(因此您将拉动整个数据库)。警告:可能存在NaN类型的值,但这不是真的,但总的来说是。尝试:
cur.execute("SELECT * FROM birthdays WHERE year=%s OR month=%s;", (year, month))
row = cur.fetchone()
您可能需要将%s
占位符括在引号中,我无法测试并且不了解您的数据库设置。这是一个参数化查询,其中year
和month
是动态的,基于传递给函数的值。你可以通过字符串格式化来实现这一点(你会在这里的问题中看到很多人),但这确实让你暴露于SQL注入:remember {{ 3}}