5

这是我的第一篇文章!我刚开始编程,请多多包涵!

我正在尝试将一堆 .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)

我对这一切都很陌生,所以我确信我的代码根本没有效率,但我只是想把所有东西都摆好,这样我就清楚了。我不明白的是我已确保我的表具有正确定义的数据类型(对应于我的查询中的数据类型)。有什么我想念的吗?我一直在尝试解决这个问题,但不知道可能出了什么问题:/

非常感谢!!!瓦尔

4

2 回答 2

2

像往常一样, Thomas是绝对正确的:随意让 MySQLdb 处理引用问题。

除了该建议:

  1. csv 模块是你的朋友。
  2. MySQLdb 使用PEP 249中详述的“格式”参数样式。
    这对你意味着什么?
    所有参数,无论是什么类型,都应该作为字符串传递给 MySQLdb(像这样%s)。MySQLdb 将确保将值正确转换为 SQL 文字。
    顺便说一句,MySQLdb 有一些很好的文档
  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()
于 2010-02-10T04:55:48.727 回答
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 模块可以适当地引用这些值,并解决您在手动操作时可能遇到的大量问题(通常是错误的)。

于 2010-02-09T02:05:31.433 回答