[英]psycopg2 Only Displays First Row of Postgresql Database
我在tkinter窗口中運行Python3.5和Psycopg2 2.6。 我在名為backend.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
我有這段代碼的frontend.py。
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()
數據庫:
id year month
1 1999 2
2 2005 5
3 1987 11
4 1988 12
5 1978 10
PostgreSQL數據庫包含此數據。 PGAdmin2能夠很好地運行查詢並僅選擇我想要的行。 當我使用該函數對1988年進行查詢時,我在數據庫的第一行中得到了所有查詢。
1 1999 2
我認為這是一個邏輯錯誤,但我無法確定要進行具體測試。
您的查詢當前是:
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注入:記住Bobby Tables 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.