Psycopg2仅显示PostgreSQL数据库的第一行

3

我正在运行Python3.5和Psycopg2 2.6,它们在tkinter窗口中工作。 我有一个名为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

该数据库包含此数据。PGAdmin2 可以成功运行查询并仅选择我想要的行。当我使用 all 函数查询 1988 年的数据时,只会在数据库的第一行得到结果。

1 1999 2

4
因为您使用了 row = cur.fetchone() 而不是 fetchall(),所以会出现这种情况。您明确要求它只返回一个值。 - roganjosh
虽然问题似乎还有其他方面,因为您显然查询了1988年的内容,但返回了1999年的结果?这是打字错误还是真正的问题? - roganjosh
无论我使用cur.fetchone()还是cur.fetchall(),我得到的结果都是一样的。它只获取数据库的第一行。没有拼写错误,如果我搜索2005年,我得到的是1999年。这没有意义。 - tluafed
cur.fetchall() 只是获取整个数据库。 - tluafed
1个回答

2

我认为这是一个逻辑错误,但我不能具体测试以确保。

您当前的查询语句为:

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

这里有两个问题:

  1. 你使用的是 fetchone() 而不是 fetchall(),这样明显只会得到一个结果;这就是你所要求的。
  2. 你的查询只是一个简单的字符串。你没有向函数传递任何参数到查询中。每一行都有一个与该值相等的值在 year 中(你要求每个值将自己与自己进行比较),这意味着对于所有行,你的查询始终为 True(因此你将拉取整个数据库)。注意:可能存在 NaN 类型的值不满足这一条件,但总体来说是成立的。

尝试:

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

您可能需要将%s占位符括在引号中,我无法测试并不了解您的数据库设置。这是一个参数化查询,其中yearmonth是基于传递给函数的值动态生成的。您可以通过字符串格式化来实现这一点(您会在这里看到很多人这样做),但这真的会使您容易受到SQL注入攻击:请记住Bobby Tables


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接