Postgres 现有列不存在错误
Postgres existing column doesn't exist error
我在发送数据库查询时遇到了下一个问题
psycopg2.errors.UndefinedColumn: column "crossroad_id" of relation "api_accidents" does not exist
LINE 1: INSERT INTO api_accidents ("crossroad_id", "datetime_start",...
思考试错,发现是引号引起的错误
我有一个用于数据库查询的基础 class,还有一些 child class 可以对不同的表进行查询。其他 child class 可以不间断地工作。下面列出的函数,即向数据库发送查询。
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)
在 child 方法中,我只更改字段 col_names
和 query
,它在其他 classes.
中工作得很好
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
复制列名时,它起作用了。但是当我自己输入该列的名称时,它不起作用。它取决于什么 - 我不知道。
结果,第二个开发人员在创建 table 时,在 crossroad_id
列上写了西里尔文 c
而不是拉丁文...
已通过更改列名称修复。
我在发送数据库查询时遇到了下一个问题
psycopg2.errors.UndefinedColumn: column "crossroad_id" of relation "api_accidents" does not exist
LINE 1: INSERT INTO api_accidents ("crossroad_id", "datetime_start",...
思考试错,发现是引号引起的错误
我有一个用于数据库查询的基础 class,还有一些 child class 可以对不同的表进行查询。其他 child class 可以不间断地工作。下面列出的函数,即向数据库发送查询。
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)
在 child 方法中,我只更改字段 col_names
和 query
,它在其他 classes.
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
复制列名时,它起作用了。但是当我自己输入该列的名称时,它不起作用。它取决于什么 - 我不知道。
结果,第二个开发人员在创建 table 时,在 crossroad_id
列上写了西里尔文 c
而不是拉丁文...
已通过更改列名称修复。