【问题标题】:Using python and postgres, variables within execute function?使用python和postgres,执行函数中的变量?
【发布时间】:2014-07-16 19:36:31
【问题描述】:

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

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”在插入字符串时带有引号?

任何帮助将不胜感激!

【问题讨论】:

  • 通常表结构是固定的。大多数情况下,动态表都是设计错误。
  • 绝对是重复的!
  • 同样的问题?是的。复制?没有。

标签: python string postgresql parameters psycopg2


【解决方案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))
    )

【讨论】:

  • 对不起,自从你回答后我彻底改变了问题,所以我很抱歉浪费你的时间。不过,我确实找到了答案!谢谢!
【解决方案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))

这就是诀窍。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多