Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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-将多个insert语句转换为一个_Python_Mysql_Sql_Sql Insert_Bulkinsert - Fatal编程技术网

Python-将多个insert语句转换为一个

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

我现在有以下问题:

我的数据库表只有两列:ID(
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()