使用Python将CSV数据导入两个MYSQL表
我需要从一个csv文件中提取数据,并把这些数据导入到同一个数据库里的两个mysql表中。
CSV文件内容:
username,password,path
FP_Baby,7tO0Oj/QjRSSs16,FP_Baby
lukebryan,uu00U62SKhO.sgE,lukebryan
saul,r320QdyLJEXKEsQ,saul
jencarlos,LOO07D5ZxpyzMAg,jencarlos
abepark,HUo0/XGUeJ28jaA,abepark
从这个CSV文件中,username
和 password
要放到USERS表里,而path
要放到VFS_PERMISSIONS表里。
USERS表的结构如下:
INSERT INTO `USERS` (`userid`, `username`, `password`, `server_group`) VALUES
(23, 'username', 'password', 'MainUsers'),
INSERT INTO `VFS_PERMISSIONS` (`userid`, `path`, `privs`) VALUES
(23, '/path/', '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'),
如果可以的话,我希望两个表里的userid从24开始,每插入一行就加1。
到目前为止,我能读取csv文件,但我还不知道怎么把数据插入到两个mysql表里。
#!/usr/bin/env python
import csv
import sys
import MySQLdb
conn = MySQLdb.connect(host= "localhost",
user="crushlb",
passwd="password",
db="crushlb")
x = conn.cursor()
f = open(sys.argv[1], 'rt')
try:
reader = csv.reader(f)
for row in reader:
## mysql stuff goes here right?
finally:
f.close()
2 个回答
0
既然你已经知道想要执行的SQL语句,那么使用cursor.execute
这个方法就应该比较简单明了:
offset = 23
for row_number, row in enumerate(reader):
username, password, path = row
x.execute("INSERT INTO `USERS` (`userid`, `username`, `password`, `server_group`) "
"VALUES (%s, %s, %s, 'MainUsers')", (row_number+offset, username, password))
x.execute("INSERT INTO `VFS_PERMISSIONS` (`userid`, `path`, `privs`) "
"VALUES (%s, %s, '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'", (row_number+offset, path))
2
你可以通过提前准备好参数(在循环中),然后在循环结束后调用 cursor.executemany
来减少对 cursor.execute
的调用次数。
cursor = conn.cursor()
user_args = []
perm_args = []
perms = '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'
with open(sys.argv[1], 'rt') as f:
for id, row in enumerate(csv.reader(f), start = 24):
username, password, path = row
user_args.append((id, username, password, 'MainUsers'))
perm_args.append((id, path, perms))
insert_users = '''
INSERT IGNORE INTO `USERS`
(`userid`, `username`, `password`, `server_group`)
VALUES (%s, %s, %s, %s)
'''
insert_vfs_permissions = '''
INSERT IGNORE INTO `VFS_PERMISSIONS`
(`userid`, `path`, `privs`)
VALUES (%s, %s, %s)
'''
cursor.executemany(insert_users,user_args)
cursor.executemany(insert_vfs_permissions,perm_args)
INSERT IGNORE
是告诉 MySQL 尝试将数据插入到表中,但如果出现冲突就忽略这个操作。举个例子,如果 userid 是主键,而表中已经有一行数据的 userid 和你要插入的相同,那么 INSERT IGNORE
就会忽略这个插入命令,因为这样会导致有两行数据的主键是一样的。
如果没有 IGNORE
,那么 cursor.executemany
命令就会抛出一个异常,导致无法插入任何数据。
我使用 INSERT IGNORE
是为了让你可以多次运行这段代码,而不会因为 cursor.executemany
报错而失败。
还有一个命令叫 INSERT ... ON DUPLICATE KEY UPDATE
,它告诉 MySQL 尝试插入一行数据,如果有冲突就更新这行数据。不过我就不多说这个了,除非你想了解更多关于 ON DUPLICATE KEY
的内容。