gpt4 book ai didi

python - psycopg2 只显示 Postgresql 数据库的第一行

转载 作者:行者123 更新时间:2023-12-04 16:06:31 25 4
gpt4 key购买 nike

我在 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 能够正常运行查询并仅选择我想要的行。当我使用 all 函数运行 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 注入(inject):记住 Bobby Tables .

关于python - psycopg2 只显示 Postgresql 数据库的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48510066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com