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

时间:2017-12-02 09:48:34

标签: python-3.x mysql-python psycopg2

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

用户选择代码,大小和颜色并输入数量。表名由大小和代码组成(例如,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']))))

2 个答案:

答案 0 :(得分:1)

您要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似乎比必须动态创建查询更好。

答案 1 :(得分:0)

当您遇到错字错误时,也应该出现此错误消息,应该使用sql.Literal('someFixedNumber'),而不要使用sq.Identifier('someFixedNumber')