我正在尝试使用psycopg2执行“插入表”命令。我在函数中创建命令字符串,该函数返回以下形式的字符串:
create table %s ( %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , primary key %s );
该函数还返回一个字符串变量元组,我想用它来填写格式字符串:
('games', 'score_loser', 'integer', 'playoffs', 'boolean', 'record_loser', 'integer[]', 'broadcast', 'varchar(20)', 'date', 'date', 'id', 'varchar (30)', 'home_team', 'varchar (50)', 'record_winner', 'integer[]', 'winner', 'varchar (50)', 'loser', 'varchar (50)', 'score_winner', 'integer', 'id')
但是当我尝试执行命令时,我遇到的问题是元组中的变量被放入单引号中,这导致psycopg2中出现语法错误:
psycopg2.ProgrammingError: syntax error at or near "'games'"
第1行:创建表'游戏'('score_loser''整数','季后赛'......
有人可以告诉我应该做什么吗?
你不能这样做。来自Psycopg documentation on query parameters:
只应通过此方法绑定查询值:它不应用于将表或字段名称合并到查询中(Psycopg将尝试将表名称作为字符串值引用,生成无效的SQL)。如果需要动态生成SQL查询(例如动态选择表名),可以使用psycopg2.sql模块提供的功能:
>>> cur.execute("INSERT INTO %s VALUES (%s)", ('numbers', 10)) # WRONG
>>> cur.execute( # correct
... SQL("INSERT INTO {} VALUES (%s)").format(Identifier('numbers')),
... (10,))