【问题标题】:SQL placeholder using character versus numeric values使用字符与数值的 SQL 占位符
【发布时间】:2023-01-13 01:03:11
【问题描述】:

我试图更熟悉占位符以从 python 运行 SQL 命令,但无法成功传递字符命令。在这里,我描述了一个将被放大的简化解决方案。在 python 中,我可以使用占位符创建基本的 SQL 查询

sql = 'SELECT * FROM schema.my_table\nLIMIT %s'

并设置运行包含在函数中的命令,该函数采用 sql 命令加上一个值(行数限制)。

def my_function(query, value):
conn=pg_engine().raw_connection()
with conn.cursor() as conn:
  cursor.execute(query, value)
conn.commit()
return rowcount

例如,如果我执行my_function(sql, [10]),这可以成功运行,但是如果我尝试运行my_function(sql, ['ALL']),那么我会收到一个错误

bigint 类型的无效输入语法

所以它显然期待一个数值;在这种情况下是否有不同的传递字符串的方式,或解决此问题的另一种方式?

谢谢

【问题讨论】:

  • %s 用于传递参数而不是 SQL 文字。您使用什么 Python 库进行 Postgres 连接?如果是 psycopg2,则查看 sql 以获得安全的 SQL 字符串组合。
  • 是的,我正在使用psycopg2,将再看一下链接

标签: python sql postgresql type-safety


【解决方案1】:

一个简单的例子

import psycopg2
from psycopg2 import sql

sql_str = sql.SQL('SELECT * FROM schema.my_table LIMIT {}').format(sql.SQL('ALL'))

print(sql_str.as_string(con))
SELECT * FROM schema.my_table LIMIT ALL

虽然说实话 sql.SQL 没有逃脱。

【讨论】:

    猜你喜欢
    • 2013-09-13
    • 2019-07-25
    • 1970-01-01
    • 2016-10-24
    • 2020-06-09
    • 1970-01-01
    • 2018-03-14
    • 2019-04-08
    • 1970-01-01
    相关资源
    最近更新 更多