Это - мое первое сообщение! Я также только что начал программировать, поэтому терпите меня!
Я пытаюсь загрузить набор .csv файлов в базу данных для позже выполнения различных отчетов о данных. Я начался путем составления нескольких таблиц в mysql с соответствием именам полей и типам данных к тому, что будет загружено в таблицы. Я управляю именем файла (для парсинга даты для использования в качестве поля в моей таблице), и чистка данных с Python.
Таким образом, моя проблема прямо сейчас (ха-ха...) состоит в том, что я получаю это сообщение об ошибке, когда я пытаюсь, 'Вставляют В' запрос в mysql.
Traceback (most recent call last):
File "C:\Program Files\Python\load_domains2.py", line 80, in <module>
cur.execute(sql)
File "C:\Program Files\Python\lib\site-packages\MySQLdb\cursors.py", line 166, in execute
self.errorhandler(self, exc, value)
File "C:\Program Files\Python\lib\site-packages\MySQLdb\connections.py", line 35, in defaulterrorhandler
raise errorclass, errorvalue
OperationalError: (1054, "Unknown column 'a1200e.com' in 'field list'")
'a1200e.com' относится к определенному доменному имени, которое я вставляю в тот столбец. Мой запрос следующие:
sql="""INSERT INTO temporary_load
(domain_name, session_count, search_count, click_count,
revenue, revenue_per_min, cost_per_click, traffic_date)
VALUES (%s, %d, %d, %d, %d, %d, %d, %s)""" %(cell[0],
int(cell[1]),
int(cell[2].replace (",","")),
int(cell[3].replace(",","")),
float(cell[4].replace("$","")),
float(cell[5].replace("$","")),
float(cell[6].replace("$","")),
parsed_date)
cur.execute(sql)
Я являюсь очень новым во всем этом, таким образом, я уверен, что мой код не вообще эффективен, но я просто хотел разметить все так, что это ясно мне. То, что я не понимаю, - то, что я удостоверился, что моя таблица имеет правильно определенные типы данных (соответствующий тем, которые в моем запросе). Есть ли что-то, что я пропускаю? Я пытался разработать это некоторое время и не знаю то, что могло быть неправильным:/
Большое спасибо!!! Val
Томас , как обычно, абсолютно прав: не стесняйтесь позволить MySQLdb решать проблемы с цитированием.
В дополнение к этой рекомендации:
% s
). MySQLdb будет следить за тем, чтобы значения были правильно преобразованы в литералы SQL. Вот один из способов вставить значения в базу данных MySQL из файла .csv:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv
import MySQLdb
import os
def main():
db = MySQLdb.connect(db="mydb",passwd="mypasswd",) # connection string
filename = 'data.csv'
f = open(filename, "rb") # open your csv file
reader = csv.reader(f)
# assuming the first line of your csv file has column names
col_names = reader.next() # first line of .csv file
reader = csv.DictReader(f, col_names) # apply column names to row values
to_db = [] # this list holds values you will insert to db
for row in reader: # loop over remaining lines in .csv file
to_db.append((row['col1'],row['col2']))
# or if you prefer one-liners
#to_db = [(row['col1'],row['col2']) for row in reader]
f.close() # we're done with the file now
cursor = db.cursor()
cursor.executemany('''INSERT INTO mytable (col1,col2)
VALUES (%s, %s)''', to_db) # note the two arguments
cursor.close()
db.close()
if __name__ == "__main__":
main()
Вы должны использовать цитирование DB-API вместо прямого включения данных в запрос SQL:
sql = """INSERT INTO temporary_load
(domain_name, session_count, search_count, click_count,
revenue, revenue_per_min, cost_per_click, traffic_date)
VALUES (%s, %d, %d, %d, %d, %d, %d, %s)"""
args = (cell[0],
int(cell[1]),
int(cell[2].replace (",","")),
int(cell[3].replace(",","")),
float(cell[4].replace("$","")),
float(cell[5].replace("$","")),
float(cell[6].replace("$","")),
parsed_date)
cur.execute(sql, args)
Это заставляет цитировать модуль DB-API соответствующие значения и решает целый ряд проблем, которые могут возникнуть при выполнении этого вручную (и обычно неправильно.)