Сообщение об ошибке в курсоре Python-MySQL: 1054 неизвестный столбец «х» в «списке полей» - PullRequest
5 голосов
/ 09 февраля 2010

Это мой первый пост! Я также только начал программировать, поэтому, пожалуйста, потерпите меня!

Я пытаюсь загрузить несколько файлов .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

Ответы [ 2 ]

2 голосов
/ 10 февраля 2010

Томас , как обычно, абсолютно прав: не стесняйтесь, чтобы MySQLdb решал проблемы с цитированием.

В дополнение к этой рекомендации:

  1. Модуль csv - ваш друг.
  2. MySQLdb использует стиль параметра «формат», как описано в PEP 249 .
    Что это значит для вас?
    Все параметры, независимо от того, тип , должны быть переданы MySQLdb в виде строк (например, %s). MySQLdb обеспечит правильное преобразование значений в литералы SQL.
    Кстати, в MySQLdb есть хорошая документация .
  3. Не стесняйтесь включать более подробную информацию о ваших исходных данных. Это может упростить диагностику проблемы.

Вот один из способов вставить значения в базу данных 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()
1 голос
/ 09 февраля 2010

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

...