Я использую следующий скрипт для загрузки CSV-файлов в базу данных SQLite. Этот сценарий хорошо работает для меня, но не работает для моих коллег, которые получают следующее сообщение об ошибке: sqlite3.ProgrammingError: Вы не должны использовать 8-битные строки байтов, если вы не используете text_factory, которая может интерпретировать 8-битные строки байтов (например, text_factory = str).
Все используют Python 3.7. Единственное отличие состоит в том, что мой компьютер настроен на английском языке, а их на французском. Я знаю, что есть сообщения об этой ошибке, но пока ничего не получалось, включая использование io.open.
Мысли?
import sqlite3
from sqlite3 import Error
import glob
import csv
import os
import io
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
my_db = os.path.join(BASE_DIR, 'pythontest\\db.sqlite3')
extension = 'csv'
my_files = os.path.join(BASE_DIR, 'pythontest\\ref_tables')
os.chdir(my_files)
import_files = glob.glob('*.{}'.format(extension))
# Then load reference tables
def load_reference_tables():
sqlite_connection = None
try:
sqlite_connection = sqlite3.connect(my_db)
cursor = sqlite_connection.cursor()
print("Connected to SQLite")
except Error as e:
print('Failed to connect to database', e)
for filename in import_files:
with open(filename, "r") as f:
data = csv.DictReader(f)
cols = data.fieldnames
tablename = os.path.splitext(os.path.basename(filename))[0]
sql_str = "insert into %s values (%s)" % (tablename, ','.join(["?" for col in cols]))
cursor.executemany(sql_str, (list(map(row.get, cols)) for row in data)),
sqlite_connection.commit()
print("Tables updated successfully ")
sqlite_connection.close()
load_reference_tables()