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