5

我正在尝试使用 Pony ORM 将多个值插入到我的 postgres 数据库中。我目前的方法效率很低:

from pony.orm import *

db = Database()

class Names(db.Entity):
    first_name = Optional(str)
    last_name = Optional(str)


family = [["Peter", "Mueller"], ["Paul", "Meyer"], ...] 


@db_session
def populate_names(name_list)
    for name in name_list:
        db.insert("Names", first_name=name[0], last_name=name[1])


if __name__ == "__main__":
    db.bind(provider='postgres', user='', password='', host='', database='')
    db.generate_mappings(create_tables=True)
    populate_names(family)

这只是一个简短的示例,但输入的结构是相同的:列表列表。我从几个 xml 文件中提取数据并一次插入一个“文件”。

有谁知道如何将多行数据放入 Pony ORM 中的一个插入查询中?

4

3 回答 3

4

Pony 没有为此提供特别的东西,你可以使用execute_valuesfrom psycopg2.extras。从中获取connection对象db以使用它。

from psycopg2.extras import execute_values
...
names = [
    ('はると', '一温'),
    ('りく', '俐空'),
    ('はる', '和晴'),
    ('ひなた', '向日'),
    ('ゆうと', '佑篤')
]

@db_session
def populate_persons(names):
    sql = 'insert into Person(first_name, last_name) values %s'
    con = db.get_connection()
    cur = con.cursor()
    execute_values(cur, sql, names)

populate_persons(names)

execute_values快速执行助手列表中,所以我认为我应该是最有效的方法。

于 2018-08-03T10:33:58.123 回答
1

目前我正在为未来的项目尝试 PonyORM,并且得出了您提供的结论。

如何以庞大的方式插入数据的唯一方法是:

# assuming data has this structure:
# [['foo','bar','bazooka'],...]
@db_session
def insert_bulk_array(field1, field2, field3):
    MyClass(field1=field1, field2=field2, field3=field3)

# assuming the data is:
# {'field1':'foo','field2':'bar','field3':'bazooka'}
@db_session
def insert_bulk_dict(data)
    MyClass(**data)

但从我的角度来看,这仍然很方便,特别是当您的数据以 JSON 形式出现时。

于 2020-02-16T21:02:57.417 回答
1

PonyORM 的问题跟踪器中有一个未解决的问题,它要求正是这个功能。

我建议投票给它。

于 2020-08-27T13:17:43.603 回答