python3 psycopg SQL 标识符必须是字符串

Posted

技术标签:

【中文标题】python3 psycopg SQL 标识符必须是字符串【英文标题】:python3 psycopg SQL identifier must be string 【发布时间】:2018-05-16 08:03:18 【问题描述】:

我正在尝试使用 mysqldb 在 tkinter GUI 项目中引用动态表和字段。使用 psycopg2.sql 处理插入语句。

用户选择代码、尺寸和颜色并输入数量。表名由大小和代码组成(例如,size-small 和 code-1111,table_name=small1111)。然后颜色是列名,数量是输入到字段中的整数。当用户选择输入时,输入会保存在字典 (tdict) 中。并调用字典元素保存在数据库表中。

table_name = tdict['Size']+tdict['Code']
stmnt = ("INSERT INTO  (%s, Date) VALUES(%s, %s)").format(sql.Identifier((table_name, tdict['Color'])))
c.execute(sql.SQL(stmnt, (tdict['Quantity'], date)))

插入查询给了我一个 TypeError

TypeError("SQL 标识符必须是字符串")

有人可以帮忙吗?我究竟做错了什么?应该如何使标识符表现为字符串? 注意:我尝试通过 str 类传递 Identifier 元素,但没有成功。即

stmnt = ("INSERT INTO  (%s, Date) VALUES(%s, %s)").format(sql.Identifier((str(table_name, tdict['Color']))))

【问题讨论】:

【参考方案1】:

当您在本应使用 sql.Literal('someFixedNumber') 而不是使用 sq.Identifier('someFixedNumber') 的地方出现拼写错误时,也会出现此错误消息

【讨论】:

【参考方案2】:

您要求sql.Identifier() 从元组中创建一个标识符,例如('small1111','magenta')。因为format()only substitutes into braces(而不是%s),我想你真正想到的是:

stmnt = sql.SQL("INSERT INTO  (, Date) VALUES(%s %s)").format( sql.Identifier(table_name), sql.Identifier(tdict['Color']) )

我建议您重新考虑您的数据库设计,尽管 --- 您可能应该拥有名为 sizecodecolor 的列,而不是为每个单独的表和列。这将防止您每次为每个新尺寸或代码添加新颜色或新表格时都必须添加新列。 SELECT count(*) FROM inventory WHERE size = 'small' AND code = '1111' GROUP BY color 似乎比动态创建查询更可取。

【讨论】:

以上是关于python3 psycopg SQL 标识符必须是字符串的主要内容,如果未能解决你的问题,请参考以下文章

SQL 标识符替换 - 使用列名列表

如何在centos pyvenv中安装python3.4 psycopg2

如何在 psycopg2 标识符中使用 redshift 复制命令

我无法在 Mac 上使用 Python3 安装 Psycopg2。我已经安装了 Python3 和 pip3

Psycopg2 在 postgres 数据库中插入 python 字典

使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询