Ste*_*ott 4 python sql postgresql psycopg2
我有一个数据库名称字典。我从字典中取一个名字
database_name = database_dict[i]
Run Code Online (Sandbox Code Playgroud)
可以说database_name的值为'foo'
使用Psycopg2我正在执行一条语句:
cur.execute("INSERT INTO %s VALUES(...);", database_name)
Run Code Online (Sandbox Code Playgroud)
我在foo处收到语法错误,因为它应该是“ INSERT INTO foo VALUES”而不是“ INSERT INTO'foo'VALUES”
有什么建议如何传递表名的字符串值并删除单引号?我应该在数据库字典值中放置一个转义符吗?
编辑:这里更紧密:我如何从postgresql中的表中删除单引号?
但是我无法使用REMOVE使它正常工作。它在remove语句内的单引号上给出了语法错误。
Clo*_*eto 13
from psycopg2.extensions import AsIs
cur.execute("INSERT INTO %s VALUES(...);", AsIs(database_name))
Run Code Online (Sandbox Code Playgroud)
http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.AsIs
顺便说一句,这不是数据库名称,而是表名称。
在尝试使用的第二个参数时,无法参数化SQL查询的结构组件,例如表和字段名cursor.execute(query, params)。仅数字/文字数据值可以参数化。
考虑将database_name变量内插到SQL查询字符串中,但使用psycopg2可以安全地sqlIdentifier()使用str.format:
from psycopg2 import sql
...
cur.execute(sql.SQL('INSERT INTO {} VALUES(...)').format(sql.Identifier(database_name)))
Run Code Online (Sandbox Code Playgroud)
在您的情况下,有效的参数化方法是绑定VALUES(...)在附加查询(例如)中传递的数据值VALUES(%s, %s, %s)。或者在其他查询中:
"SELECT %s AS NewColumn..."
"...WHERE fieldname = %s OR otherfield IN (%s, %s, %s)"
"...HAVING Max(NumColumn) >= %s"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4735 次 |
| 最近记录: |