Python Pony ORM Вставить несколько значений одновременно

Я пытаюсь вставить несколько значений в свою базу данных postgres, используя Pony ORM. Мой текущий подход очень неэффективен:

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?


person Melvin    schedule 02.08.2018    source источник


Ответы (3)


Pony не предоставляет для этого ничего специального, вы можете использовать execute_values от 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 находится в списке помощников быстрого выполнения, поэтому я думаю, что это должен быть наиболее эффективным способом.

person sashaaero    schedule 03.08.2018

В настоящее время я экспериментирую с 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.

person Thomas Klinger    schedule 16.02.2020

В системе отслеживания проблем PonyORM есть открытая проблема, которая запрашивает именно эту функцию.

Рекомендую проголосовать за него.

person mrh1997    schedule 27.08.2020