mariadb python -使用SELECT执行多个

swvgeqrz  于 2023-02-01  发布在  Python
关注(0)|答案(2)|浏览(141)

我试图在mariaDB中的一个表中输入许多行。为此,我想使用executemany()来提高速度。插入的行依赖于另一个表,这是用SELECT找到的。我发现SELECT语句在executemany()中不起作用。有没有其他方法来解决这个问题?

import mariadb

connection = mariadb.connect(host=HOST,port=PORT,user=USER,password=PASSWORD,database=DATABASE)
cursor = connection.cursor()
  
query="""INSERT INTO [db].[table1] ([col1], [col2] ,[col3])
VALUES ((SELECT [colX] from [db].[table2] WHERE [colY]=? and
[colZ]=(SELECT [colM] from [db].[table3] WHERE [colN]=?)),?,?)
ON DUPLICATE KEY UPDATE 
[col2]= ?,
[col3] =?;"""

values=[input_tuplets]

当运行代码时,我得到[col1](SELECT语句)的相同值,它对应于第一个元组的值。
如果SELECT在executemany()中不起作用,对于我想做的事情有没有其他的解决方法?谢谢!

35g0bw71

35g0bw711#

我认为阅读所需的表,在python中进行搜索,使用exeutemany()插入所有数据。这将需要2个以上的查询(读取到表),但在计算时间方面是可以的。

gfttwv5a

gfttwv5a2#

感谢您提出的第一个关于stackoverflow的问题,该问题发现了MariaDB服务器中的一个错误。
下面是重现该问题的简单脚本:

CREATE TABLE t1 (a int);
CREATE TABLE t2 LIKE t1;
INSERT INTO t2 VALUES (1),(2);

巨蟒:

>>> cursor.executemany("INSERT INTO t1 VALUES \
    (SELECT a FROM t2 WHERE a=?))", [(1,),(2,)])
>>> cursor.execute("SELECT a FROM t1")
>>> cursor.fetchall()
[(1,), (1,)]

我已在MariaDB漏洞跟踪系统中提交了issue
作为一种解决方法,我建议将国家表读入一个数组(根据Wikipedia,有195个不同的国家),并使用这些值而不是子查询。
例如:

countries= {}
cursor.execute("SELECT country, id FROM countries")
for row in cursor:
  countries[row[0]]= row[1]

然后在执行中

cursor.executemany("INSERT INTO region (region,id_country) values ('sounth', ?)", [(countries["fra"],) (countries["ger"],)])

相关问题