SQL Вставка базы данных с Python - Производительность - PullRequest
0 голосов
/ 03 апреля 2020

Я перебираю различные текстовые файлы, загружаю текст в словари словарей и затем подключаюсь к базе данных и вставляю эти тексты в таблицу.

Словари словарей, потому что в каждом файле у меня есть несколько текстовых блоков, которые содержат различные части текста, которые мне нужны, такие как имя, тип, содержание и так далее. И поскольку мне нужна мета-упорядоченная информация, я сохраняю данные в этих двух слоях: уровень файла и уровень текстового блока

Это мой код - сначала строка для подготовки DB INSERT:

table_q = 'zz_querys'
query_id = 'query_name'
type_col = 'query_type'
descr_col = 'query_descr'
code_col = 'pure_code'

insertQuery = 'INSERT INTO [' + table_q + '] ([' + query_id + '], ' \
                                        '[' + type_col + '], ' \
                                        '[' + descr_col + '], ' \
                                        '[' + code_col + '])' \
                        '\nVALUES (?, ?, ?, ?)'

и затем присоединение к базе данных:

with conn:
    cursor = conn.cursor()
    for file, text_block in all_data.items():
        file = os.path.splitext(file)[0]
        for subtext in text_block:
            cat = text_block[subtext]
            qName = cat['query_name']
            qType = cat['type']
            qDescr = cat['descr_de']
            qCont = cat['content']
            cursor.execute(insertQuery, (qName, qType, qDescr, qCont))

Так что с точки зрения производительности я чувствую, что это неэффективно - я вызываю код SQL INSERT каждый раз, когда пробегаю l oop (каждую вставку строка) но я изначально не исходил из технической стороны, поэтому я не уверен, есть ли способ, который намного эффективнее.

Моя альтернативная идея состояла в том, чтобы загрузить мои вложенные диктитарные результаты в pandas dataframe (или сохранить результаты в dataframe с самого начала), а затем сразу вставить весь dataframe в базу данных. Я не делал этого в pandas раньше, но я предполагаю, что это возможно.

Будет ли это иметь огромное значение для производительности? Или какой еще самый эффективный способ сделать это?

1 Ответ

0 голосов
/ 03 апреля 2020

Вы пробовали cursor.executemany(...) вместо cursor.execute(...)?

Также вы можете просто добавить cursor.fast_executemany = True для повышения производительности executemany. Подробнее см. здесь .

ИЛИ

Если вы хотите попробовать его, используя pandas. Попробуйте это:

import sqlalchemy
import os
import pandas as pd
engine = sqlalchemy.create_engine("<Dialect>",isolation_level="AUTOCOMMIT")

for file in Path("/path/to/folder").iterdir():
    with open(file,mode='r' as file_open:
              results.append(file_open.read())
df=pd.DataFrame(results)
df.to_sql(table,engine,index=False,if_exists="append")

Диалекты или DBAPI ( См. Здесь ).

Для получения дополнительной информации об улучшении производительности нажмите здесь .

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