Python 在psycopg2中传递参数
我正在尝试使用psycopg2访问PostgreSQL:Python 在psycopg2中传递参数,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在尝试使用psycopg2访问PostgreSQL: sql = """ SELECT %s FROM table; """ cur = con.cursor() input = (['id', 'name'], ) cur.execute(sql, input) data = pd.DataFrame.from_records(cur.fetchall()) 但是,返回的结果是: 0 0 [id, name] 1 [id, name]
sql = """
SELECT
%s
FROM
table;
"""
cur = con.cursor()
input = (['id', 'name'], )
cur.execute(sql, input)
data = pd.DataFrame.from_records(cur.fetchall())
但是,返回的结果是:
0
0 [id, name]
1 [id, name]
2 [id, name]
3 [id, name]
4 [id, name]
如果我尝试访问单个列,它看起来像:
0
0 id
1 id
2 id
3 id
4 id
在列名周围加引号似乎有问题(不应该有单引号):
但我在关注博士:
谁能告诉我这里发生了什么?非常感谢 使用AsIs扩展
import psycopg2
from psycopg2.extensions import AsIs
column_list = ['id','name']
columns = ', '.join(column_list)
cursor.execute("SELECT %s FROM table", (AsIs(columns),))
mogrify将显示它没有引用列名并按原样传递它们。原因是您将数组['id','name']的字符串表示形式作为SQL查询参数传递,而不是作为列名传递。因此,生成的查询类似于
SELECT 'id, name' FROM table
看起来您的表有5行,所以返回的结果就是每行的这个文本
列名不能是SQL查询参数,而只能是通常的字符串参数,您可以在执行查询之前准备这些参数-
sql = """
SELECT
%s
FROM
table;
"""
input = 'id, name'
sql = sql % input
print(sql)
cur = con.cursor()
cur.execute(sql)
data = pd.DataFrame.from_records(cur.fetchall())
在这种情况下,生成的查询是
SELECT
id, name
FROM
table;
现在,您可以使用以下方法以干净、安全的方式完成此操作:
从psycopg2导入sql
声明=”“”
挑选
{id},{name}
从…起
桌子
"""
将con.cursor()作为cur:
cur.execute(sql.sql(语句).format(
id=sql.sql.Identifier(“id”),
name=sql.sql.Identifier(“名称”)
))
data=pd.DataFrame.from_记录(cur.fetchall())
有关查询组合的更多信息,请参见此处:
SELECT
id, name
FROM
table;