2010-02-09 54 views
5

這是我的第一篇文章!我剛剛開始編程,所以請忍受我!python-mysql光標錯誤信息:1054字段列表中的未知列「x」

我想一堆的.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) 

我對這一切很新的,所以我相信我的代碼是不是在所有有效的,但我只是想一切都奠定了所以很清楚地知道。我不明白的是我已經確保我的表已經正確定義了數據類型(對應於我的查詢中的數據類型)。有什麼我失蹤?我一直在努力工作,這一點一會兒,不知道什麼是錯的:/

非常感謝! 瓦爾

回答

1

您應該使用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模塊報價適當的值,並解決整個主機您可能會在手動執行時遇到的問題(通常不正確)。

+0

好,謝謝。出於某種原因,我對其他回覆的人的評論已經消失......也許你能幫助我? 基本上,現在我需要也擺脫浮動類型的逗號...但我已經取代了美元符號。我怎樣才能替換一個變量的兩種類型的符號? – DalivDali 2010-02-09 02:21:28

+0

@DalivDali,如果你問每個問題一個問題,你會得到答案 - 但回答「半個問題」,因爲你在一個問題中提出兩個問題,而一個已經得到回答的問題沒有多大意義(事實上它沒有多大意義你可以在一個問題中提出兩個問題!!!)。 – 2010-02-09 02:39:05

2

Thomas與往常一樣絕對正確:隨意讓MySQLdb處理引用問題。

除此之外推薦:

  1. csv module是你的朋友。
  2. MySQLdb使用「格式」參數樣式,詳見PEP 249
    這對你意味着什麼?
    所有參數,不管type,應該作爲字符串傳遞給MySQLdb(如%s)。 MySQLdb將確保這些值正確轉換爲SQL文字。
    順便說一句,MySQLdb有一些good documentation
  3. 隨意包含關於您的源數據的更多細節。這可能會使診斷問題變得更容易。

下面是從.csv文件插入值到MySQL數據庫的一種方法:

#!/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() 
相關問題