psycopg2 无法插入特定列

Posted

技术标签:

【中文标题】psycopg2 无法插入特定列【英文标题】:psycopg2 unable to insert into specific columns 【发布时间】:2016-10-21 22:57:45 【问题描述】:

我有一个使用psycopg2 库通过Python 访问的postgres 数据库。我尝试插入的表如下所示:

                                                          Table "public.programmes"
   Column    |            Type             |                        Modifiers                        | Storage  | Stats target | Description
-------------+-----------------------------+---------------------------------------------------------+----------+--------------+-------------
 id          | bigint                      | not null default nextval('programmes_id_seq'::regclass) | plain    |              |
 title       | character varying           | not null                                                | extended |              |
 start       | timestamp without time zone | not null                                                | plain    |              |
 end         | timestamp without time zone | not null                                                | plain    |              |
 description | character varying           | not null                                                | extended |              |
 genre       | character varying           | not null                                                | extended |              |
 edited      | boolean                     | not null                                                | plain    |              |

id 列被创建为bigserial 到autoincrement 的新条目。

由于id 列会自动递增,我只尝试插入有关剩余字段的数据。我将数据创建为列表并尝试像这样插入它:

def main():
    postConn = psycopg2.connect("dbname=TEST host=127.0.0.1 user=user")
    postCur = postConn.cursor()

    prog_data = form_programme_data()
    #prog_data = ['The Next Step', '2016-05-29T10:20:00', '2016-05-29T10:45:00', "2/34. My Boyfriend's Back: Reality-style drama following a group of dancers. A-Troupe meets their new choreographer and votes for open auditions for the nationals team. Also in HD. [S]", 'Lifestyle', False]

    postCur.execute("""INSERT INTO programmes(title, start, end, description, genre, edited) VALUES (%s, %s, %s, %s, %s, %s);""", prog_data)

我得到这个错误:

Traceback (most recent call last):
File "convert_db.py", line 58, in <module>
main()
File "convert_db.py", line 32, in main
postCur.execute("""INSERT INTO programmes(title, start, end, description, genre, edited) VALUES (%s, %s, %s, %s, %s, %s);""", prog_data)
psycopg2.ProgrammingError: syntax error at or near "end"
LINE 1: INSERT INTO programmes(title, start, end, description, genre...
                                             ^

如果我在不指定列名的情况下尝试插入,它需要一个我无法触及的 id 的值。它不会抱怨提供的前两个列名,但由于某种原因不喜欢end

感谢任何帮助。

【问题讨论】:

【参考方案1】:

显然,end 是 PostgreSQL 中的 key word。您需要引用它以使其被解释为标识符:

postCur.execute("""INSERT INTO programmes
    (title, start, "end", description, genre, edited)
    VALUES (%s, %s, %s, %s, %s, %s);""", prog_data)

【讨论】:

谢谢。您和advance512 关于end 作为关键字是正确的,我添加了引号,它按预期工作!再次感谢。 天啊...我刚刚为此浪费了半天时间。谢谢!【参考方案2】:

我很确定end 是 Postgres 中的保留关键字。尝试将列名更改为其他名称 - 这肯定会解决问题。或者,懒惰的解决方案可能是更改您的代码:

postCur.execute("""INSERT INTO programmes('title', 'start', 'end', 'description', 'genre', 'edited') VALUES (%s, %s, %s, %s, %s, %s);""", prog_data)

看看它是否能解决您的问题并告诉我们。

【讨论】:

以上是关于psycopg2 无法插入特定列的主要内容,如果未能解决你的问题,请参考以下文章

psycopg2连接问题,无法选择列,但连接正常

无法使用 psycopg2 从亚马逊红移读取列类型

Psycopg2 在 postgres 数据库中插入 python 字典

psycopg2 - 字段“id”缺少数据时出错?

Psycopg2 使用占位符插入表格

psycopg2:用一个查询插入多行