【问题标题】:INSERT tuple into table - psycopg2将元组插入表中 - psycopg2
【发布时间】:2014-11-28 16:47:26
【问题描述】:

我试图弄清楚如何在不需要像这样的琐碎语法的情况下将值元组插入到预定义的表中:

cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",
...      (100, "abc'def"))

因为我的元组具有正确的值序列,如下所示:

my_tuple = ('D', 'Z107383320', '99501', '995013688', None, '36', '88', '36', '88', 'A', 'F', 'C083', '', 'BARROW', 'ST', '', '0000000605', '0000000605', 'O', 'DOCTORS COLLECTIONS SVC', 'STE', '00000001', '00000001', 'O', 'B', '', '', '020312', 'AK', '020', 'AL', '', '', 'Z10014', 'zip4mst9')

我想知道一些简单的解决方案 :-) 比如:

cur.execute("INSERT INTO test (*) VALUES (*)",
    ...      (my_tuple))

由于我创建了表模式并且元组具有相同的属性序列,我想这是可以做到的,而无需将所有参数一一传递给 cur.execute()

【问题讨论】:

  • 当您向表中添加新列时,指定列的重点并没有中断所有查询。也就是说,如果你喜欢偷懒,你应该考虑使用 ORM,比如 SQLAlchemy。另外,不要把括号放在(my_tuple) 周围——它们什么都不做(你已经有一个元组,而且元组是由逗号而不是括号创建的)

标签: python postgresql psycopg2


【解决方案1】:

使用这张桌子

create table t (
    a int,
    b text
);

省略列列表并将元组作为单个值传递

query = """
    insert into t values %s
    returning *
"""
my_tuple = (2, 'b')

cursor.execute(query, (my_tuple,)) # Notice the comma after my_tuple
rs = cursor.fetchall()
conn.commit()
for row in rs:
    print row

打印

(2, 'b')

完成上述操作后,我认为不明确列出列是一种不好的做法

【讨论】:

  • 这非常有效。我同意这是不好的做法,但是如果您尝试插入任意表(就像我一样),那么获取字段名称并将其放入查询中需要做更多的工作。谢谢!
  • 为什么会出现这个错误? AttributeError:“元组”对象没有属性“键”
【解决方案2】:

给定:

t = (100, "abc'def")

然后:

sql = "INSERT INTO test (num, data) VALUES (" + ",".join(["%s"]*len(t)) + ")"
cur.execute(sql, t)

即每个字段重复一次占位符,逗号分隔。

是的,它很难看,但没有神奇的“所有参数”通配符。也许应该有。

【讨论】:

  • 出现错误 AttributeError: 'tuple' object has no attribute 'keys' 在尝试此解决方案时。
  • @JuanPerez 您可能使用的是较新的 psycopg2 版本,如果您希望使用类似字典的光标,则必须明确要求类似记录的元组:psycopg.org/docs/extras.html#dictionary-like-cursor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 2023-03-10
  • 2021-11-02
  • 2021-12-31
  • 2021-02-03
相关资源
最近更新 更多