我一直在尝试使用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")
答案 0 :(得分:1)
确定。首先,祝贺自学!
现在,重点。
使用insert ... values
时,无法为要插入值的表定义where条件。 insert
语句仅用于插入(当您使用insert... select
时,您可以在选择上定义where
条件,而不是在您选择的表格上重新插入值。)
所以,有两种方法可以做你想做的事:
insert ignore...
我会告诉你如何处理第一个建议,因为它会教你几件事。至于建议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,正如我告诉你的那样,我把它作为家庭作业留给你。
提示: