Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将CSV数据传输到两个MYSQL表_Python_Mysql_Csv - Fatal编程技术网

使用Python将CSV数据传输到两个MYSQL表

使用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

我需要从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文件

用户名
密码
进入用户表
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行“”附近使用的正确语法”)
请参见我在此处尝试的操作: