簡體   English   中英

psycopg2僅顯示Postgresql數據庫的第一行

[英]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()

這有兩個問題:

  1. 您使用的是fetchone()而不是fetchall()因此很明顯,您只會得到一個結果。 那就是你要的。
  2. 您的查詢只是一個簡單的字符串。 您實際上尚未將任何參數傳遞給函數到查詢中。 每一行都有一個值year等於該值year (你問每個值本身與其自身進行比較),這意味着您的查詢始終是True所有行(所以你會拉動整個數據庫)。 注意:可能存在NaN類型的值,但事實並非如此,而是全面的。

嘗試:

cur.execute("SELECT * FROM birthdays WHERE year=%s OR month=%s;", (year, month))
row = cur.fetchone()

您可能需要將%s占位符放在引號中,我無法測試,也不知道您的數據庫設置。 這是一個參數化查詢,其中yearmonth根據傳遞給函數的值是動態的。 可以通過字符串格式化做到這一點(在這里您會看到很多人在做這個問題),但這確實使您容易遭受SQL注入:記住Bobby Tables

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM