psycopg2 从带有占位符的元组中设置 PRIMARY KEY

psycopg2 set PRIMARY KEY from tuple with placeholder

如何根据从元组循环的值元组在 psycopg2 中设置主键?

例如我有我的元组

meetattrs = ('id', 'venue', 'date', 'rail', 'weather', 'trackcondition')

然后我想创建 table 并提取和插入值。从 meetattrs 我希望将 id 设置为主键。

conn = psycopg2.connect("")
with conn, conn.cursor() as cur:
        # First, create tables.
    cur.execute("drop table if exists meetings, races, horses")
    cur.execute("create table meetings (id integer PRIMARY KEY, " +
                ", ".join("%s varchar" % fld for fld in meetattrs)
                + ")")

然而,这会产生此错误,不确定如何解决。

Traceback (most recent call last):
  File "racemeeting.py", line 56, in <module>
    + ")")
psycopg2.ProgrammingError: column "id" specified more than once

遇到那种问题,你应该先尝试构建和控制sql字符串。

("create table meetings (id integer PRIMARY KEY, " +
            ", ".join("%s varchar" % fld for fld in meetattrs)
            + ")")

给出:

'create table meetings (id integer PRIMARY KEY, id varchar, venue varchar, date varchar, rail varchar, weather varchar, trackconditionvarchar)'

有效复制 id 列。

解决方案很简单:从 meetattrs 中删除第一个标识符:

cur.execute("create table meetings (id integer PRIMARY KEY, " +
            ", ".join("%s varchar" % fld for fld in meetattrs[1:])
            + ")")

或者,如果您不能确定第一个元素是主键:

cur.execute("create table meetings (id integer PRIMARY KEY, " +
            ", ".join("%s varchar" % fld for fld in meetattrs if fld != 'id')
            + ")")

在执行 join 并且占位符取其值后,您当前的 sql 查询是:

'create table meetings (id integer PRIMARY KEY, id varchar, venue varchar, date varchar, rail varchar, weather varchar, trackcondition varchar)'

id 被指定了两次。

您可以以更简洁的方式构建查询:

query_params = " %s integer PRIMARY KEY" + ", %s varchar" * (len(meetattrs) - 1)

您的 SQL 语句变为:

"create table meetings (" + query_params % meetattrs + ")"

插入占位符值后:

'create table meetings (id integer PRIMARY KEY, venue varchar, date varchar, rail varchar, weather varchar, trackcondition varchar)'

确保你的元组的第一项总是 id