2010-02-09 21 views
5

Questo è il mio primo post! I anche appena iniziato a programmare, quindi per favore portami con me!Messaggio di errore in python-mysql cursor: 1054 colonna sconosciuta "x" in 'field list'

Sto provando a caricare un gruppo di file .csv in un database, per poter eseguire successivamente vari rapporti sui dati. Ho iniziato creando alcune tabelle in mysql con nomi di campi e tipi di dati corrispondenti a ciò che verrà caricato nelle tabelle. Sto manipolando il nome del file (per analizzare la data da usare come campo nella mia tabella) e pulire i dati con python.

Quindi il mio problema adesso (haha ...) è che ottengo questo messaggio di errore quando provo la query "Inserisci in" su 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' fa riferimento a un nome di dominio specifico che sto inserendo in quella colonna. La mia domanda è la seguente:

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) 

Sono molto nuovo a tutto questo, quindi sono sicuro che il mio codice non è affatto efficiente, ma volevo solo gettare tutto fuori in modo che sia chiaro per me. Quello che non capisco è che mi sono assicurato che la mia tabella avesse tipi di dati definiti correttamente (corrispondenti a quelli della mia interrogazione). C'è qualcosa che mi manca? Ho cercato di risolvere questo problema per un po 'e non so cosa potrebbe essere sbagliato:/

Grazie mille !!! Val

risposta

1

Si deve usare DB-API citando invece di inserire i dati nella query SQL direttamente:

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) 

Questo rende la citazione modulo di DB-API i valori in modo appropriato, e si risolve tutta una serie di problemi che potresti ottenere quando lo fai a mano (e di solito in modo non corretto)

+0

ok grazie. Per qualche ragione, il mio commento ad un'altra persona che ha risposto è sparito ... forse puoi aiutarmi? Fondamentalmente, ora devo anche eliminare le virgole per i tipi di float ... ma sto già sostituendo i segni del dollaro. Come posso sostituire due tipi di simboli per una variabile? – DalivDali

+0

@DalivDali, se fai una domanda per ogni domanda otterrai delle risposte - ma rispondendo a "una mezza domanda" dato che stai facendo due domande in una sola domanda e una risposta già ottenuta ha poco senso (anzi, ha poco senso per te per chiedere 2 domande in una !!!). –

2

Thomas è, come al solito, assolutamente corretto: sentiti libero di lasciare che MySQLdb gestisca i problemi di quotazione.

In aggiunta a tale raccomandazione:

  1. Il csv module è tuo amico.
  2. MySQLdb utilizza lo stile del parametro "formato" come descritto in PEP 249.
    Che cosa significa per te?
    Tutti i parametri, qualunque sia type, devono essere passati a MySQLdb come stringhe (come questo %s). MySQLdb farà in modo che i valori vengano convertiti correttamente in letterali SQL.
    A proposito, MySQLdb ha qualche good documentation.
  3. Sentiti libero di includere più dettagli sui tuoi dati di origine. Ciò potrebbe rendere più semplice la diagnosi del problema.

Ecco un modo per inserire i valori a un database MySQL da un file .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() 
Problemi correlati