Вставить список словарей Python в базу данных PSQL - PullRequest
0 голосов
/ 02 июля 2018

У меня есть список словарей с теми же ключами (встроенный в Python), которые я хотел бы вставить в базу данных PSQL. Имена ключей совпадают со столбцами базы данных PSQL. Может ли кто-нибудь предложить что-нибудь, чтобы сделать это эффективно?

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Вы можете использовать executemany в PSQL для одновременной вставки нескольких записей следующим образом:

conn=psycopg2.connect("dbname='db_name' user='db_user' password='db_pass'")

data = [{"col1":"data11", "col2":"data21"},
            {"col1":"data12", "col2":"data22"},
            {"col1":"data13", "col2":"data23"}]


cur = conn.cursor()
cur.executemany("""INSERT INTO bar(col1,col2) VALUES (%(col1)s, %(col2)s)""", data)

Если у вас нет структуры dict, вам необходимо убедиться, что данные находятся в правильной последовательности ваших столбцов в таблице как:

cur.executemany(
    """INSERT INTO bar(col1,col2) 
       VALUES (%s,%s)""", data)

и данные должны быть в формате:

data = [['data11', 'data21'], ['data12', 'data22']]

Это то, что вы пытаетесь сделать? Дайте мне знать, это работает.

0 голосов
/ 03 июля 2018

Из документов :

Текущая реализация executemany() (с использованием чрезвычайно благотворительного занижения) не особенно эффективна.

В соответствии с этой нитью, вы должны использовать cursor.copy_from или extras.execute_values, которые выполняют одиночные массовые вставки.

copy_from

data = [{'col1': 1, 'col2': 2}, {'col1': 3, 'col2': 4}, {'col1': 5, 'col2':6}]
f = IteratorFile(("{0}\t{1}".format(k['col1'], k['col2']) for k in data.keys()))
cursor.copy_from(f, 'table_name', columns=('col1', 'col2'))

Пожалуйста, смотрите здесь для теста производительности по сравнению с cursor.execute.

execute_values

data = [{'col1': 1, 'col2': 2}, {'col1': 3, 'col2': 4}, {'col1': 5, 'col2':6}]
insert_query = 'insert into table_name (a, b) values %s'
psycopg2.extras.execute_values(
    cursor, insert_query, [tuple(d) for d in data]
)
0 голосов
/ 02 июля 2018

Вы можете использовать .executemany метод. Пример использования psycopg2:

cursor.executemany(
    'INSERT INTO mytable (field_a, field_b, filed_c) '
    'VALUES (%(field_a)s, %(field_b)s, %(field_c)s)',
    data
)

data может быть вашим списком диктов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...