在Python和Postgres中,execute函数内的变量?

2 投票
2 回答
9757 浏览
提问于 2025-04-18 13:35

我有一个关于在Python函数中使用变量的问题,这个函数是用来访问PostgreSQL服务器的。比如,下面这个例子:

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

但是,如果我想让这个更新函数接收一个叫做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"带上引号,这该怎么处理呢?

任何帮助都非常感谢!

2 个回答

4

要传递标识符,可以使用 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))
    )
3

解决了:

我明白我之前做错了什么。其实我只需要在var_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))

这样就解决了问题。谢谢!

撰写回答