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

时间:2014-07-16 19:36:31

标签: python string postgresql parameters psycopg2

我对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 个答案:

答案 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))

这就是诀窍。谢谢!