使用Python将CSV数据传输到两个MYSQL表
我需要从csv文件中获取数据,并将其导入同一数据库中的两个mysql表中 CSV文件:使用Python将CSV数据传输到两个MYSQL表,python,mysql,csv,Python,Mysql,Csv,我需要从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文件 用户名和密码进入用户表 p
username,password,path
FP_Baby,7tO0Oj/QjRSSs16,FP_Baby
lukebryan,uu00U62SKhO.sgE,lukebryan
saul,r320QdyLJEXKEsQ,saul
jencarlos,LOO07D5ZxpyzMAg,jencarlos
abepark,HUo0/XGUeJ28jaA,abepark
从CSV文件
用户名
和密码
进入用户表
path
进入VFS\u权限表
用户表看起来像
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开头,csv中的每一行都以+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()
因为您已经知道要执行的sql语句,所以使用
游标应该或多或少更简单。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))
您可以减少对
游标的调用次数。通过提前准备参数(在循环中)并在循环完成后调用游标来执行
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尝试将行插入MySQL表,但如果有冲突,则忽略该命令。例如,如果userid是主键,并且已经有一行具有相同的userid,那么INSERT IGNORE
SQL将忽略插入新行的命令,因为这将创建具有相同主键的两行
如果没有忽略
,则cursor.executemany
命令将引发异常并无法插入任何行
我使用了INSERT IGNORE
,因此您可以在不使用游标的情况下多次运行代码。executemany
引发异常
还有一个插入。。。在DUPLICATE KEY UPDATE
命令中,该命令告诉MySQL尝试插入一行,但如果有冲突,则更新该行,但我将保留该命令,除非您想了解有关DUPLICATE KEY
的更多信息我尝试实现您的代码,但出现以下错误`File“import\u ftp\u users-v2.py',第16行打开(sys.argv[1],'rt'))使用f:^SyntaxError:invalid syntax`谢谢,下面是代码。嗯,我写错了那句话。它应该是,打开(…)作为f:
。我已经编辑了我的帖子来说明我的意思。类似的错误,请参见此处的全文:更新的代码:谢谢。注意,insert\u vfs\u permissions
的末尾有一个逗号。尝试了此操作,但出现了编程错误<代码>\u mysql\u exceptions.ProgrammingError:(1064,“您的SQL语法有错误;请查看与您的mysql服务器版本对应的手册,以了解第1行“”附近使用的正确语法”)
请参见我在此处尝试的操作: