使用 Python 中的变量与 PostgreSQL 通信

Using variables in Python to communicate with PostgreSQL

我一直在尝试将变量放入我的 SQL 命令中。但是,当我尝试这样做时:

def interact_database(command):
    connection = psycopg2.connect("dbname=NAME user=NAME password=PASSWORD")
    cursor = connection.cursor()

    cursor.execute(command)
    connection.commit()

    results = None
    try:
        results = cursor.fetchall()
    except psycopg2.ProgrammingError:
        print("Connection failure.")
        pass

    cursor.close()
    connection.close()

    return results


def pick_question(type):
    if type == 'G':
        QuestionID = random.randint(1,38)
    elif type == 'Gr':
        QuestionID = random.randint(39,60)
    elif type == 'R':
        QuestionID = random.randint(61,89)
    else:
        QuestionID = random.randint(90,119)
    interact_database("SELECT Question FROM Questions WHERE Question_ID = %s")(QuestionID)

pick_question('G')

我收到这个错误

psycopg2.ProgrammingError: syntax error at or near "%"
LINE 1: SELECT Question FROM Questions WHERE Question_ID = %s

我已经多次尝试用谷歌搜索它,但无论我在哪里读到它,它都应该有效。有人知道我在这里做错了什么吗?提前致谢!

您还没有将变量传递给 SQL 查询。您所做的只是将它放在 next 调用您的 interact_database 函数之后。您需要修改该函数以接受数据,然后将其传递给 cursor.execute;然后实际将数据传递给函数。所以:

def interact_database(command, params=None):
    ...
    cursor.execute(command, params)

...
interact_database("SELECT Question FROM Questions WHERE Question_ID = %s", (QuestionID,))

尝试将数据库连接 api 包装在自己的 class 中是一个常见的新手错误。它总是导致这样的问题。所以不要

connection = psycopg2.connect("dbname=NAME user=NAME password=PASSWORD")
cursor = connection.cursor()

def pick_question(type, cursor):
    if type == 'G':
        QuestionID = random.randint(1,38)
    elif type == 'Gr':
        QuestionID = random.randint(39,60)
    elif type == 'R':
        QuestionID = random.randint(61,89)
    else:
        QuestionID = random.randint(90,119)

    cursor.execute("SELECT Question FROM Questions WHERE Question_ID = %s" , (QuestionID,))
    connection.commit()


pick_question('G', cursor)