当一个变量的类型名称传递创造使用psycopg2利用其格式选项Postgres的,错误是抛过来坏字符串格式化为对象的名称。 名字是不允许使用的查询参数内%s的传递?
我写的代码,不会解决问题,我下面是(只是在寻找更好的方法来解决这个)
cursor.execute("CREATE TYPE {0} AS ENUM %s".format(name), (tuple(set([e.upper() for e in elements])),))
当一个变量的类型名称传递创造使用psycopg2利用其格式选项Postgres的,错误是抛过来坏字符串格式化为对象的名称。 名字是不允许使用的查询参数内%s的传递?
我写的代码,不会解决问题,我下面是(只是在寻找更好的方法来解决这个)
cursor.execute("CREATE TYPE {0} AS ENUM %s".format(name), (tuple(set([e.upper() for e in elements])),))
(2)是完全无关的PostgreSQL的,也许编辑了这个问题,并在一个新的问题后呢? 我会回答(1)。
正如你猜,你不能传递之类的表名作为查询参数。
他们发送的协议级绑定参数和(危重)查询必须是可解析为与他们有效的SQL用作占位符 。 这是因为如果你运行一个SQL级PREPARE
再分出EXECUTE
。 你必须准备它,使用适当的标识符引用之前他们格式化为SQL字符串。
双引号的标识符(S)你代入你正在被传递的字符串可能会提前结束你的引用序列中可能的双引号的提防。 这些都必须加倍。 例如,表名some"table
,你可以使用:
'SELECT * FROM "{0}"'.format('some""table');
SQL注入是一个非常严重的风险; 你必须让你的报价完全正确。 理想的情况是发现客户端等效的PostgreSQL quote_ident
SQL函数。
需要注意的是双引号的标识符是区分大小写的。 请确保您通过始终使用它们用双引号与数据库相同的情况下创建它们,不要混合报价,不带引号的标识符。
你应该从来没有真正的python-格式的查询,但让psycopg2做到这一点。 这里是让它的方式: http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries即:
cur.execute("INSERT INTO numbers VALUES (%s)", (42,))
与2.7版本开始,一些高级格式化的可能性都可以通过psycopg2.sql
模块: http://initd.org/psycopg/docs/sql.html
我就遇到了这个问题,也写下了简短的博客文章 ,其覆盖连接到使用字符串格式化远程数据库,但这个问题,我的分辨率是适用于你需要传递变量到SQL命令的任何情况。
这里是我的工作解决此问题:
import psycopg2 as db
import sys
my_host = 'ec2-190-111-829-829.compute-1.amazonaws.com'
my_dbname = 'myDBNameGoesHere'
my_user = 'myUsernameGoesHere'
my_password = 'myPasswordGoesHere'
remote_connection_str = 'host={0} dbname={1} user={2} password={3}'.format(my_host, my_dbname, my_user, my_password)
if __name__ == '__main__':
try:
remote_connection = db.connect(remote_connection_str)
cursor = remote_connection.cursor()
cursor.execute('SELECT version()')
version = cursor.fetchone()
print "\n"
print "Successful connection to database."
print "Database information:\n", version
print "\n"
except db.DatabaseError, e:
print 'Error %s' % e
sys.exit(1)
finally:
if remote_connection:
remote_connection.close()