【问题标题】:Creating queries through loops and checking wether row exists or else insert通过循环创建查询并检查是否存在行或插入
【发布时间】:2016-02-23 23:29:10
【问题描述】:

我有一个 Python 列表列表,我正在尝试将其插入或更新到 Postgresql。我已经尝试了 for 循环和 while 循环,但是当我试图检查用户是否已经存在于 postgres 中时它会变得混乱。我想遍历列表列表并在 postgres 中插入/更新每个用户。

我有以下变量,您建议我选择哪种方式?我的最后一个镜头是 if exists,它不适用于 postgres..

userList = [user1, user2, user3]
i=0 
while ( i < len(userList)):
    query = "IF EXISTS (SELECT * FROM login WHERE email = '" + userList[i][2] + "') INSERT INTO login (created, username, password, email) VALUES (NOW(), '" + userList[i][0] + "','" + userList[i][1] + "','" + userList[i][2] + "')"
    i += 1
    settings.database_connection.execute_sql(query)

提前谢谢你!

【问题讨论】:

  • for user in user_list。你用什么来连接数据库?
  • @PadraicCunningham 与数据库的连接如何相关?
  • @DawidFerenczy,因为有一种叫做文档的小东西通常可以准确地向您展示您想知道的内容,或者文档也不相关?
  • @PadraicCunningham 没有人在谈论任何文档。我在问你如何连接到与他的问题相关的数据库。
  • @SLI Ildar 的答案是一个更好的解决方案,但是(如果你有例如旧版 PostgreSQL)你也可以简单地将它拆分为 2 个单独的查询:首先会选择,然后检查它是否返回任何内容在 Python 中,根据结果执行插入或更新。

标签: python postgresql


【解决方案1】:

PostgreSQL 9.5 中有一个新功能(所谓的 UPSERT)。所以你可以插入或更新一行:

INSERT INTO login VALUES (<your values>)
ON CONFLICT(email) DO UPDATE SET password=..., email=...;

更多详情见官方文档:PostgreSQL 9.5.1 Documentation: INSERT

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2020-07-11
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多