使用python和postgres,execute函数中的变量?

2024-06-26 00:11:42 发布

您现在位置:Python中文网/ 问答频道 /正文

关于访问PostgreSQL服务器的python函数中变量的使用,我有一个问题。例如,以下内容:

def delete():
    cur.execute(
    """DELETE FROM potluck 
    WHERE name = var_1;"""

但是,如果我想让update函数为var_1引入变量,我该怎么做?

例如,我希望我的函数采用以下形式:

def delete(var_1):
    cur.execute(
    """DELETE FROM potluck 
    WHERE name = %s;""", (var_1))

然而,仅仅打字是行不通的。

另外,在这种情况下,当:

def delete(name, var_1):
    cur.execute(
    """DELETE FROM potluck 
    WHERE %s = %s;""", (name, var_1))

我不希望“name”在插入字符串时有引号?

任何帮助都将不胜感激!


Tags: 函数namefrom服务器executepostgresqlvardef
2条回答

已解决:

我明白我做错了什么。我需要做的唯一更改是在变量1后添加逗号,因为: “对于位置变量绑定,第二个参数必须始终是序列,即使它包含单个变量。还要记住,Python需要一个逗号来创建一个单元素元组”。

例如:

def delete(var_1):
    cur.execute(
    """DELETE FROM potluck 
    WHERE name = %s;""", (var_1,))

这很管用。我得到的信息来自:

http://initd.org/psycopg/docs/usage.html#sql-injection

在第二种情况下,请参考下面使用AsIs的另一个答案。那很有效。例如:

def delete(name, var_1):
    cur.execute(
    """DELETE FROM potluck 
    WHERE %s = %s;""", (AsIs(name), var_1))

这就是诀窍。谢谢!

要传递标识符,请使用psycopg2.extensions.AsIs

from psycopg2.extensions import AsIs

def update(table_name, var_1, var_2):
    cur.execute("""
        UPDATE %s
        SET %s = 'Y'
        WHERE %s = 'John';
        """,
        (AsIs(table_name), AsIs(var_1), AsIs(var_2))
    )

相关问题 更多 >