【问题标题】:Python MySQLdb is not inserting all the recordsPython MySQLdb没有插入所有记录
【发布时间】:2017-08-22 18:05:42
【问题描述】:

我一直在编写 Python 脚本。这个脚本应该填充一个从 select 语句中获取值的 MySQL 表。

问题是当我从 select 语句中获取值时,insert into 语句无法正常工作并且没有插入所有记录。我在 MySQL WorkBench 中检查了相同的 select 语句,并返回了我想放入目标表中的正确记录数。 select语句是这样的,预期的行数超过100.000(是一个大数据库):

SELECT MAX(c1),MAX(c2),MAX(c3),MAX(c4),c5,c6,MAX(c7)
FROM Table1 as t1
INNER JOIN Table2 as t2 ON t1.Id = t2.Id
INNER JOIN Table3 as t3 ON t1.Id = t3.Id
WHERE c4 NOT LIKE '%A%'
GROUP BY t1.c1;

此选择语句应返回不包含“A”字符的记录。

这是我的 Python 代码:

import MySQLdb

db = MySQLdb.connect(host,user,pass,dbName)
cursor = db.cursor()
cursor.execute("SELECT MAX(c1),MAX(c2),MAX(c3),MAX(c4),c5,c6,MAX(c7)
     FROM Table1 as t1
     INNER JOIN Table2 as t2 ON t1.Id = t2.Id
     INNER JOIN Table3 as t3 ON t1.Id = t3.Id
     WHERE c4 NOT LIKE '%A%'
     GROUP BY t1.c1")

results = cursor.fetchall()

for row in results:
    cursor.execute("INSERT INTO DestinationTable(col1,col2,col3,col4,col5,col6)VALUES('%s','%s','%s','%s','%s','%s')"
         %(str(row[1]),str(row[2]),str(row[3]),str(row[4]),str(row[5]),str(row[6]))
   db.commit()

我认为问题出在 Insert into 语句中,但我不确定。

【问题讨论】:

  • 您是否有理由不使用INSERT INTO ... SELECT ... all in one execute call?
  • 我认为你的提议是一个缓慢的陈述,我不知道它是否是最佳的......也许我错了对不起
  • 避免循环,所有进程都在 MySQL 引擎中处理。
  • 谢谢芭菲,我去试试

标签: python mysql sql


【解决方案1】:

只需运行 INSERT INTO ... SELECT 而不是 ...VALUES,它不需要循环或 SQL 字符串插值(无论如何都应该是 parameterized)。

MAX(c1) 下方的语句已从 SELECT 语句中删除,因为您在尝试查询时跳过了它:

sql = "INSERT INTO DestinationTable(col1, col2, col3, col4, col5, col6)
       SELECT MAX(c2), MAX(c3), MAX(c4), c5, c6, MAX(c7)
       FROM Table1 as t1
       INNER JOIN Table2 as t2 ON t1.Id = t2.Id
       INNER JOIN Table3 as t3 ON t1.Id = t3.Id
       WHERE c4 NOT LIKE '%A%'
       GROUP BY t1.c1"

cursor.execute(sql)
db.commit()

【讨论】:

  • Parfait 我试过了但是不行,有些结果丢失了。
  • 怎么可能?检查SELECT 列和INSERT INTO 中对应列之间的类型。确保它们对齐。此外,您可能具有不允许重复记录的表约束,例如主键/索引。发布SHOW CREATE TABLE DestinationTable 输出。
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 2012-02-03
  • 2015-09-10
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多