postgresql 使用字符与数值的SQL占位符

8xiog9wr  于 2023-01-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(341)

我试图更熟悉占位符以便从python运行SQL命令,但无法成功传递字符命令。在这里,我将介绍一个简化的解决方案,该解决方案将被扩展。在python中,我可以使用占位符创建基本的SQL查询
sql = 'SELECT * FROM schema.my_table\nLIMIT %s'
并设置为运行 Package 在函数中的命令,该函数接受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的输入语法无效
因此它显然需要一个数值;在这种情况下,是否有不同的方法来传递字符串,或者有另一种方法来解决这个问题?
谢谢

mwg9r5ms

mwg9r5ms1#

一个简单的例子

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并没有逃脱。
你可以得到同样的效果做:

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

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

这使用sql.Literal,它更安全。

相关问题