Python & Sqlite3 - загрузка текстового файла в базу данных SQL не работает

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

Код ниже:

def input_txt_to_db():
    with open(our_txt_file) as f:
        for line in f:
            # Format each line 
            curr_comp_name = str(line.rsplit(':')[0])
            curr_comp_key = str(line.rsplit(':')[-2])
            # Create object of the line
            curr_comp = Company(curr_comp_name, curr_comp_key)
            # Insert company is a self-made method, listed below
            insert_company(curr_comp)

def insert_company(comp):
    """

    :param comp: Company (object)
    :return: None
    """
    with conn:
        conn_cursor.execute("INSERT INTO companies VALUES "
                            "(:name, :key)",
                            {'name': comp.name,
                             'key': comp.key
                             })

Теперь все это работает, и я проверил базу данных, чтобы увидеть, и она загрузилась правильно. Однако, как только он говорит 60 тыс. Строк, он падает. Это дает мне какую-то ошибку, например, ошибку ОС или что-то в этом роде. Также обратите внимание, у меня более чем достаточно места для этой базы данных.

1 ответ

Решение

В любом случае это не самый эффективный способ загрузки данных. Как насчет загрузки данных по частям с executemany?

def insert_companies(comps):
    with conn:
        conn_cursor.executemany("INSERT INTO companies VALUES (?, ?)", comps)

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

def input_txt_to_db():
    with open(our_txt_file) as f:
        batch = list()
        # How many companies do we dump to db at once?
        batch_size = 2000
        for line in f:
            # Format each line 
            curr_comp_name = str(line.rsplit(':')[0])  # why str? it should be string as it is
            curr_comp_key = str(line.rsplit(':')[-2])
            # Create object of the line
            batch.append((curr_comp_name, curr_comp_name))
            # Insert company is a self-made method, listed below
            if len(batch) == batch_size:
                 insert_companies(batch)
                 batch = list()
        # something may be still pending
        if batch:
            insert_companies(batch)

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

Другие вопросы по тегам