学习MySQL,Python - 跳过重复

时间:2014-10-11 15:18:10

标签: mysql sql python-2.7

我一直在尝试使用python来学习SQL来更新数据库并尝试做一些简单的事情。通过包含财富500的csv文件及其收入信息进行迭代并推入SQL数据库。我已经运行了几次并且它工作得很好,唯一的问题是我得到重复,因为我已经运行了几次相同的文件。

将来,我认为学习如何避免重复是很好的。环顾四周后,我发现使用WHERE NOT EXISTS提出的解决方案,但是我遇到了错误。欢迎任何建议,因为我是全新的。

注意 - 我知道我应该一次更新多行,这是我的下一课

import pymysql
import csv

with open('companies.csv','rU') as f:
    reader = csv.DictReader(f)
    for i in reader:

        conn = pymysql.connect(host='host', user='user', passwd='pw', db='db_test')
        cur = conn.cursor()

        query1 = "INSERT INTO companies (Name, Revenue, Profit, Stock_Price) VALUES (\'{}\',{},{},{})".format(str(i['Standard']),float(i['Revenues']),float(i['Profits']),float(i['Rank']))
        query2 = 'WHERE NOT EXISTS (SELECT Name FROM companies WHERE Name = \'{}\')'.format(str(i['Standard']))
        query = query1+' '+query2

        cur.execute(query)
        conn.commit()
        cur.close()

输出:

INSERT INTO companies (Name, Revenue, Profit, Stock_Price) VALUES ('WalMart Stores',469.2,16999.0,1.0) WHERE NOT EXISTS (SELECT Name FROM companies WHERE Name = 'WalMart Stores')

ERROR:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT Name FROM companies WHERE Name = 'WalMart Stores')' at line 1")

1 个答案:

答案 0 :(得分:1)

确定。首先,祝贺自学!

现在,重点。

使用insert ... values时,无法为要插入值的表定义where条件。 insert语句仅用于插入(当您使用insert... select时,您可以在选择上定义where条件,而不是在您选择的表格上重新插入值。)

所以,有两种方法可以做你想做的事:

  1. 在要测试的列上创建唯一索引,然后使用insert ignore...
  2. 在您的代码中,检查该值是否已经存在,如果不存在,则将其插入。
  3. 我会告诉你如何处理第一个建议,因为它会教你几件事。至于建议2,我会留给你作为家庭作业; - )

    首先,您需要为表添加唯一索引。如果您想避免在Name列上重复,请:

    alter table companies
        add unique index idx_dedup_name(Name);
    

    Check the syntax for ALTER TABLE

    现在,让我们说Companies已经有一行名为'XCorp'的行。如果您在此处尝试正常INSERT... VALUES语句,则会收到错误,因为您尝试添加重复值。如果您想避免该错误,可以使用以下内容:

    insert ignore into companies(name) values ('XCorp');
    

    这将作为普通插入执行,但是,由于您尝试插入重复值,它将失败,但是会静默(它会抛出警告而不是错误)。


    至于建议2,正如我告诉你的那样,我把它作为家庭作业留给你。

    提示:

    1. 计算名称与值匹配的行。
    2. 将计数读入python程序中的变量
    3. 测试值...如果条目为零,则执行插入。