我在发送数据库查询时遇到下一个麻烦
psycopg2.errors.UndefinedColumn: column "crossroad_id" of relation "api_accidents" does not exist
LINE 1: INSERT INTO api_accidents ("crossroad_id", "datetime_start",...
经过反复试验,我发现错误是由引号引起的。
我有一个用于数据库查询的基类,以及一些子类,它们可以对不同的表进行查询。其他孩子上课的工作不受干扰。下面列出的功能,即向数据库发送查询。
def send(self, args):
query = sql.SQL(self.query).format(
sql.SQL(', ').join(map(sql.Identifier, self.col_names)),
sql.SQL(', ').join(map(sql.Placeholder, self.col_names))
)
self.cursor.execute(query, args)
在子方法中,我只更改了col_names
和query
字段,它在其他类中效果很好。
query = """INSERT INTO api_accidents ({}) VALUES ({})"""
col_names = ['crossroad_id', 'datetime_start', 'datetime_stop']
这种原始查询工作
INSERT INTO api_accidents (сrossroad_id, datetime_start, datetime_stop)
VALUES (1, current_timestamp, NULL)
这不起作用
INSERT INTO api_accidents ("сrossroad_id", "datetime_start", "datetime_stop")
VALUES (1, current_timestamp, NULL)
但是标准的sql.SQL
格式会进行第二次查询。
是否可以在不手动在查询中编写列名称的情况下解决此问题?
更新
我再次检查了一下,发现它不依赖于引号。无论带引号或不带引号,此查询均有效:
INSERT INTO api_accidents (сrossroad_id, datetime_start, datetime_stop)
VALUES (1, current_timestamp, NULL);
这根本不起作用:
INSERT INTO api_accidents (crossroad_id, datetime_start, datetime_stop)
VALUES (1, current_timestamp, NULL);
是的,它们是完全一样的。但是Postgres不这么认为。
更新2
最后我发现,当我从information_schema.columns
复制列名时,它可以工作。但是,当我自己输入该列的名称时,它不起作用。它取决于什么-我不知道。
答案 0 :(得分:0)
结果,发现第二个开发人员在创建表时在列c
上写了西里尔字母crossroad_id
而不是拉丁文...
通过更改列名来固定。