psycopg2 - Вставка списка словарей в базу данных PosgreSQL.Слишком много казней? - PullRequest
0 голосов
/ 01 марта 2019

Я вставляю список словарей в базу данных PostgreSQL.Список будет быстро расти, и число значений dict (столбцов) будет около 30. Предполагаемые данные:

projects = [
{'name': 'project alpha', 'code': 12, 'active': True},
{'name': 'project beta', 'code': 25, 'active': True},
{'name': 'project charlie', 'code': 46, 'active': False}
]

Вставка данных в базу данных PostgreSQL с помощью следующего кода работает (как в этом ответ ), но я беспокоюсь о том, чтобы выполнить слишком много запросов.

for project in projects:
    columns = project.keys()
    values = project.values()

    query = """INSERT INTO projects (%s) VALUES %s;"""

    # print(cursor.mogrify(query, (AsIs(','.join(project.keys())), tuple(project.values()))))

    cursor.execute(query, (AsIs(','.join(columns)), tuple(values)))

conn.commit()

Есть ли лучшая практика?Заранее большое спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Используйте execute_values ​​() , чтобы вставить сотни строк в один запрос.

import psycopg2
from psycopg2.extras import execute_values

# ...

projects = [
{'name': 'project alpha', 'code': 12, 'active': True},
{'name': 'project beta', 'code': 25, 'active': True},
{'name': 'project charlie', 'code': 46, 'active': False}
]

columns = projects[0].keys()
query = "INSERT INTO projects ({}) VALUES %s".format(','.join(columns))

# convert projects values to sequence of seqeences
values = [[value for value in project.values()] for project in projects]

execute_values(cursor, query, values)
conn.commit()
0 голосов
/ 01 марта 2019

Вы можете использовать массовую загрузку, чтобы сделать это быстрее.

https://www.citusdata.com/blog/2017/11/08/faster-bulk-loading-in-postgresql-with-copy/

...