在Python和Postgres中,execute函数内的变量?
我有一个关于在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))
这样就解决了问题。谢谢!