psycopg2仅显示Postgresql数据库的第一行

时间:2018-01-29 21:13:19

标签: python database postgresql psycopg2

我在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

1 个答案:

答案 0 :(得分:0)

我认为这是一个逻辑错误,但我无法专门测试以确定。

您的查询目前是:

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

这有两个问题:

  1. 您使用了fetchone()代替fetchall(),因此很清楚您只会得到一个结果;这就是你所要求的。
  2. 您的查询只是一个简单的字符串。您实际上并未将函数的任何参数传递给查询。 每个行的year值都等于year中的值(您要求每个值将自身与自身进行比较),这意味着您的查询总是如此所有行都为True(因此您将拉动整个数据库)。警告:可能存在NaN类型的值,但这不是真的,但总的来说是。
  3. 尝试:

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

    您可能需要将%s占位符括在引号中,我无法测试并且不了解您的数据库设置。这是一个参数化查询,其中yearmonth是动态的,基于传递给函数的值。你可以通过字符串格式化来实现这一点(你会在这里的问题中看到很多人),但这确实让你暴露于SQL注入:remember {{ 3}}