Python-将多个insert语句转换为一个
我现在有以下问题: 我的数据库表只有两列:ID(Python-将多个insert语句转换为一个,python,mysql,sql,sql-insert,bulkinsert,Python,Mysql,Sql,Sql Insert,Bulkinsert,我现在有以下问题: 我的数据库表只有两列:ID(primary key,auto increment)和value(varchar(100)) 现在我有了一个sql文件来用值填充该表。但关键是:首先,文本文件只有一个插入,因此插入的每个值都是一个值。如果不是1000万条线的话,一般来说都不会有问题 更有趣的是,我有5个表和5个带有insert语句的.sql文件 现在我试着按原样运行sql文件,即使只运行了10万行,也花了一个小时。。。因此,插入1000万条条目需要大约100小时。。。所有表格的x
primary key,auto increment
)和value(varchar(100)
)
现在我有了一个sql
文件来用值填充该表。但关键是:首先,文本文件只有一个插入,因此插入的每个值都是一个值。如果不是1000万条线的话,一般来说都不会有问题
更有趣的是,我有5个表和5个带有insert语句的.sql
文件
现在我试着按原样运行sql文件,即使只运行了10万行,也花了一个小时。。。因此,插入1000万条条目需要大约100小时。。。所有表格的x5大约需要500小时,即21天。。我不想看到这里发生什么
从我所读到的,如果一个insert语句包含多个要插入的值,那么速度会快得多。。。例如:
insert into knownPasswords3 (password)
values ('! -');
insert into knownPasswords3 (password)
values ('! 3');
insert into knownPasswords3 (password)
values ('! 5');
insert into knownPasswords3 (password)
values ('! ?');
insert into knownPasswords3 (password)
values ('! C');
insert into knownPasswords3 (password)
values ('! c');
将成为:
insert into knownPasswords3 (password)
values ('! -','! 3','! 5','! ?','! C''! c');
例如。。。据我所知,每个insert语句大约40个值将是一个非常好的值
所以这就是我想要的。。从包含400条语句的sql文件(例如),到包含10条语句(每条语句有40个值)的sql文件
现在我已经尝试了很多正则表达式和记事本++中的不同方法作为例子,但我不能真正让它工作
然后我想,如果python能够以优雅的方式做到这一点(或者直接将其插入数据库,或者只是转换文本文件)。我认为插入不会有多大帮助,所以现在我正在寻找一种将文件转换为另一个文件的方法,只是它减少了前面提到的单个语句
我的伪代码将类似于:
open file.sql
i = 0;
for each line in file.sql:
if i==40:
i=0
break
else:
remove text "insert into knownPasswords3 (password) values ("
remove text ");"
add text ,
然而,我试过了,只是无法让这些部件工作
有人能让我走上正确的道路吗?是否有一个lib或其他东西使这变得更容易?我认为问题出在您试图准备的insert语句中。它应该是这样的:
insert into knownPasswords3 (password)
values ('! -'),('! 3'),('! 5'),('! ?'),('! C'),('! c');
现在,您正在插入6行1列,而您的查询正在插入1行6列。您可以查看。它们将必须一起执行或不执行的语句组合在一起(类似于将多个语句视为一个语句)。但不能完全确定它是否是您要查找的内容。此代码纯粹基于文件处理、列表切片和字符串操作。它读取一个名为“file.sql”的文件,并在另一个名为“file2.sql”的文件中保存insert语句,每个语句有40个值 希望这能回答你的问题
# reading the lines from SQL file
file1 = open('file.sql', 'r')
lines = file1.readlines()
file1.close()
# removing the first line
lines.pop(0)
# getting a list of all the values
list_of_values = []
for i in range(0, len(lines), 3):
list_of_values.append(lines[i].split("'")[1])
# setting the limits to 40 elements per insert statement
lowerlimit = -40
upperlimit = 0
# flag to check whether the number of values left is greater than 40
remaining_values = True
# second file to save output
file2 = open('file2.sql', 'w')
while remaining_values:
# setting flag if remaining values less than 40
if len(list_of_values)-upperlimit <= 40:
remaining_values = False
# updating limits as we move traverse the list
lowerlimit = upperlimit
upperlimit = min(upperlimit + 40, len(list_of_values))
# formulating insert statement
output = 'insert into knownPasswords3 (password)\nvalues '
# adding 40 values to each insert statement
if remaining_values == True:
output += str(list_of_values[lowerlimit:upperlimit]).replace('[','(').replace(']',')') + ";\n\n"
else:
output += str(list_of_values[lowerlimit:upperlimit]).replace('[','(').replace(']',')') + ";"
# writing insert statement to output file
n = file2.write(output)
# closing the file
file2.close()
试试这个:
infile = open('file.sql', 'r' )
ins_stmnts = {}
for line in infile:
if 'insert' in line:
ins_stmnt, vals = line.split('values')
if ins_stmnt in ins_stmnts.keys():
ins_stmnts[ins_stmnt].append(vals)
else:
ins_stmnts[ins_stmnt] = [vals]
infile.close()
outfile = open("converted.sql", 'w')
for ins_stmnt, vals in ins_stmnts.items():
val_str = "("
for i, val in enumerate(vals):
if i%39==0:
val = val.rstrip(');\n')
val = val.lstrip(' (')
val_str += val
outfile.write(ins_stmnt + "values " + val_str + ');\n')
val_str = "("
break
else:
val = val.rstrip(');\n')
val = val.lstrip(' (')
val_str += val + ','
if len(val_str)>1:
outfile.write(ins_stmnt + "values " + val_str.rstrip(',') + ');\n')
outfile.close()
是的,好吧,我在这里键入的内容可能有问题。。然而,问题是,如何将我的多个单insert语句转换成一些更大的语句(每个语句40个)?手动或使用自定义代码,将
插入到knownPasswords3(密码)值中,替换为,
,除了第一个语句外,您的查询是readyyeah,这正是我在问题中写的。。。我只是不知道如何在python中真正做到这一点……尤其要记住,每个insert语句应该有大约40个insert值,而不是1000万个oncethanks值作为答案。总的来说,这似乎很好,但是,我在这一点上似乎有编解码器问题…获取UnicodeDecodeError:“charmap”编解码器无法解码6381位置的字节0x81:字符映射到
。。。。尝试使用econdig='utf-8'
打开,但也抛出了一个错误。。。尝试将rb
作为二进制文件的模式,但将其添加到列表时出现问题。。知道吗?你把编码
拼错为econdig
。还有,你的文件中有什么字符?如果我得到了文件,甚至是导致错误的子集,我可能会提供帮助。@是的,这实际上只是stackoverflow上的一个输入错误。。另外,我现在上传了一个文件到这里:这就是它现在失败的文件。。。你可以试一下that@nameless这是因为文件中有一些非ascii字符,所以在将文件传递给open函数之前,应该正确格式化文件。这似乎是行尾字符的错误
infile = open('file.sql', 'r' )
ins_stmnts = {}
for line in infile:
if 'insert' in line:
ins_stmnt, vals = line.split('values')
if ins_stmnt in ins_stmnts.keys():
ins_stmnts[ins_stmnt].append(vals)
else:
ins_stmnts[ins_stmnt] = [vals]
infile.close()
outfile = open("converted.sql", 'w')
for ins_stmnt, vals in ins_stmnts.items():
val_str = "("
for i, val in enumerate(vals):
if i%39==0:
val = val.rstrip(');\n')
val = val.lstrip(' (')
val_str += val
outfile.write(ins_stmnt + "values " + val_str + ');\n')
val_str = "("
break
else:
val = val.rstrip(');\n')
val = val.lstrip(' (')
val_str += val + ','
if len(val_str)>1:
outfile.write(ins_stmnt + "values " + val_str.rstrip(',') + ');\n')
outfile.close()