Python 3.x python3 psycopg SQL标识符必须是字符串

Python 3.x python3 psycopg SQL标识符必须是字符串,python-3.x,mysql-python,psycopg2,Python 3.x,Mysql Python,Psycopg2,我正在尝试使用MySQLdb引用TkinterGUI项目中的动态表和字段。使用psycopg2.sql处理insert语句 用户选择代码、大小和颜色并输入数量。表名由大小和代码组成,例如,小尺寸和代码-1111,表名=小1111。然后,颜色是列名,数量是字段中输入的整数。当用户选择输入时,输入保存在字典tdict中。并调用字典元素以保存在数据库表中 table_name = tdict['Size']+tdict['Code'] stmnt = ("INSERT INTO {} (%s, Dat

我正在尝试使用MySQLdb引用TkinterGUI项目中的动态表和字段。使用psycopg2.sql处理insert语句

用户选择代码、大小和颜色并输入数量。表名由大小和代码组成,例如,小尺寸和代码-1111,表名=小1111。然后,颜色是列名,数量是字段中输入的整数。当用户选择输入时,输入保存在字典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)))
insert查询给了我一个类型错误

TypeErrorSQL标识符必须是字符串

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

stmnt = ("INSERT INTO {} (%s, Date) VALUES(%s, %s)").format(sql.Identifier((str(table_name, tdict['Color']))))
您要求sql.Identifier从元组中创建标识符,例如“small1111”、“magenta”。因为是{}格式而不是%s,我认为您实际上想到的是:

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

我建议您重新考虑您的数据库设计,尽管您可能应该将列命名为size、code和color,而不是为每个列分别设置表和列。这将避免每次使用新颜色时都必须添加新列,或者每次使用新大小或代码时都必须添加新表。选择count*FROM inventory,其中size='small'和code='1111'按颜色分组似乎比必须动态创建查询更可取。

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