【问题标题】:How to insert multiple rows in PostgreSQL using Python如何使用 Python 在 PostgreSQL 中插入多行
【发布时间】:2021-12-21 13:23:15
【问题描述】:

我的数据库有以下列:id、name、group、timesamp、totaltime、errorcode

我正在尝试将以下数据列表插入数据库:

data = [
        {"name": "samplename", "group": "samplegroup", "timestamp": sampletimestamp,
            "totaltime": sampletotaltime, "errorcode": sampleerrorcode},
        {"name": "samplename", "group": "samplegroup", "timestamp": sampletimestamp,
            "totaltime": sampletotaltime, "errorcode": sampleerrorcode},
        {"name": "samplename", "group": "samplegroup", "timestamp": sampletimestamp,
            "totaltime": sampletotaltime, "errorcode": sampleerrorcode},
        {"name": "samplename", "group": "samplegroup", "timestamp": sampletimestamp,
            "totaltime": sampletotaltime, "errorcode": sampleerrorcode}
    ]

将这样的数据列表插入数据库的最佳(最短)方法是什么。我的偏好是将所有行插入在一起。

【问题讨论】:

    标签: python python-3.x postgresql sql-insert


    【解决方案1】:

    我会使用 executemany

    import psycopg2
    
        
    data = [
            {"name": "samplename", "group": "samplegroup", "timestamp": sampletimestamp,
                "totaltime": sampletotaltime, "errorcode": sampleerrorcode},
            {"name": "samplename", "group": "samplegroup", "timestamp": sampletimestamp,
                "totaltime": sampletotaltime, "errorcode": sampleerrorcode},
            {"name": "samplename", "group": "samplegroup", "timestamp": sampletimestamp,
                "totaltime": sampletotaltime, "errorcode": sampleerrorcode},
            {"name": "samplename", "group": "samplegroup", "timestamp": sampletimestamp,
                "totaltime": sampletotaltime, "errorcode": sampleerrorcode}
    ]
    
    
    db = psycopg2.connect("dbname='my_database' user='user' password='password'")   
    cursor = db.cursor() 
    cursor.executemany(
        'INSERT INTO mytable (name, group, timestamp, totaltime, errorcode) '
        'VALUES (%(name)s, %(group)s, %(timestamp)s, %(totaltime)s, %(errorcode)s)',
        data
    )
    

    【讨论】:

    • 这将逐行插入包含许多事务和往返数据库的行,而不是所有行。
    【解决方案2】:

    使用如下例所示的原生参数化查询,并将完整的 json 文本作为参数。一次事务中的所有行。根据您的表结构,类型转换可能会有所不同。

    insert into the_table (name, "group", "timesamp", totaltime, errorcode)
     select j->> 'name',
            (j ->> 'group')::integer, 
            (j ->> 'timestamp')::timestamp,
            (j ->> 'totaltime')::interval,
            (j ->> 'errorcode')::integer
     from jsonb_array_elements(%s::jsonb) j;
    

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2020-05-08
      • 2015-11-14
      • 1970-01-01
      相关资源
      最近更新 更多