import csv, sqlite3
conn = sqlite3.connect("mycustomers9.sql")
curs = conn.cursor()
try:
curs.execute("CREATE TABLE t (unknown1 TEXT, county TEXT, businessName TEXT, address1 TEXT, city1 TEXT, zip1 INTEGER, phone1 INTEGER,Email1 TEXT, approvalstatus TEXT, date1 TEXT, date2 TEXT, typeofConstruct TEXT, typeofBiz TEXT, unknown2 TEXT, unknown3 TEXT, unknown4 TEXT, unknown5 TEXT, unknown6 TEXT,BizName2 TEXT,Address2 TEXT, City2 TEXT,Zip2 TEXT,Country2 TEXT,Phone2 TEXT,Email2 TEXT,Phone3 TEXT);")
except sqlite3.OperationalError:
print "Table already exist"
with open('HR_plan_review.csv', 'rb') as infile:
dr = csv.DictReader(infile, delimiter = ',')
to_db = [(i["unknown1"], i['county'], i['businessName'], i['address1'], i['city1'], i['zip1'], i['phone1'], i['Email1'], i['approvalstatus'], i['date1'],i['date2'], i['typeofConstruct'], i['typeofBiz'], i['unknown2'], i['unknown3'], i['unknown4'], i['unknown5'], i['unknown6'], i['BizName2'], i['Address2'], i['City2'], i['Zip2'], i['Country2'], i['Phone2'], i['Email2'], i['Phone3']) for i in dr]
curs.executemany("INSERT INTO t (unknown1, county, businessName, address1, city1,zip1, phone1, Email1, approvalstatus, date1, date2,typeofConstruct, typeofBiz, unknown2, unknown3, unknown4,unknown5, unknown6,BizName2,Address2, City2,Zip2,Country2,Phone2,Email2,Phone3) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);", to_db)
to_db возвращает список, который закодирован в utf-8, и база данных sqllite, похоже, запрашивает форматирование в unicode. Как я могу преобразовать список "to_db" в Unicode перед запуском оператора SQL выше. Ниже приведено сообщение об ошибке, которое я получаю при запуске приведенного выше кода.
sqlite3.ProgrammingError: Вы не должны использовать 8-битные строки байтов
вы используете te xt_factory, которая может интерпретировать 8-битные строки байтов (например,
text_factory = str). Настоятельно рекомендуется вместо этого просто
переключите ваше приложение на строки Unicode.
Отредактировано на основе ввода из ответов
Исправленный код (ниже) теперь успешно выполняется, но он не вставляет значения, взятые из csv, в базу данных.
import csv, sqlite3
conn = sqlite3.connect("mycustomers12.sql")
curs = conn.cursor()
try:
curs.execute(""" CREATE TABLE t (unknown1 TEXT, county TEXT, businessName TEXT, address1 TEXT, city1 TEXT, zip1 INTEGER, \n
phone1 INTEGER,Email1 TEXT, approvalstatus TEXT, date1 TEXT, date2 TEXT, typeofConstruct TEXT, typeofBiz TEXT, unknown2 TEXT, \n
unknown3 TEXT, unknown4 TEXT, unknown5 TEXT, unknown6 TEXT,BizName2 TEXT,Address2 TEXT, City2 TEXT,Zip2 TEXT,Country2 TEXT,\n
Phone2 TEXT,Email2 TEXT,Phone3 TEXT);""")
except sqlite3.OperationalError:
print "Table already exist"
infile = open('HR_plan_review.csv', 'rb')
dr = csv.DictReader(infile, delimiter = ',')
keys=("unknown1", 'county', 'businessName', 'address1',
'city1', 'zip1', 'phone1', 'Email1', 'approvalstatus',
'date1','date2', 'typeofConstruct', 'typeofBiz', 'unknown2',
'unknown3', 'unknown4', 'unknown5', 'unknown6', 'BizName2',
'Address2', 'City2', 'Zip2', 'Country2', 'Phone2',
'Email2', 'Phone3')
args=[tuple(key.decode('utf-8') for key in keys) for row in dr]
sql='INSERT INTO t ({f}) VALUES ({p})'.format(
f=','.join(keys),
p=','.join(['?']*len(keys)))
curs.executemany(sql, args)