我对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”在插入字符串时有引号?
任何帮助将不胜感激!
答案 0 :(得分: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))
)
答案 1 :(得分:2)
解决:
我明白我做错了什么。我需要做的唯一更改是在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))
这就是诀窍。谢谢!