将列表或元组插入到表中,而不迭代到postgresql中

ct3nt3jp  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(2)|浏览(138)

我是python的新手。我试图实现的是将我的列表/元组中的值插入到我的红移表中,而不需要迭代。我有大约100万行和1列。
下面是我用来创建列表/元组的代码。

cursor1.execute("select domain from url limit 5;")
for record, in cursor1:
    ext = tldextract.extract(record)
    mylist.append(ext.domain + '.' + ext.suffix)

mytuple = tuple(mylist)

我不确定什么是最好使用,元组还是列表。print(mylist)print(mytuple)的输出如下所示。
列表输出
['friv.com','steep.tv',' wordpress.com ',' fineartblogger.net ',' v56.org ']
元组输出
(“friv.com”、“steep.tv”、“wordpress.com”、“fineartblogger.net”、“v56.org”)
现在,下面是我用来将值插入到红移表中的代码,但我得到了一个错误:

cursor2.execute("INSERT INTO sample(domain) VALUES (%s)", mylist) or
cursor2.execute("INSERT INTO sample(domain) VALUES (%s)", mytuple)

错误-在字符串格式化期间并非所有参数都已转换
任何帮助是感激。如果任何其他细节是需要的,请让我知道,我会编辑我的问题。

更新1:

尝试使用以下代码,但得到不同的错误。

args_str = ','.join(cur.mogrify("(%s)", x) for x in mylist)
cur.execute("INSERT INTO table VALUES " + args_str)

错误- INSERT的表达式多于目标列

wgeznvg7

wgeznvg71#

我认为您正在寻找快速执行助手:

mylist=[('t1',), ('t2',)] 
execute_values(cursor2, "INSERT INTO sample(domain) %s", mylist, page_size=100)

它的作用是用100个值替换%s。我不确定你可以把page_size设置得多高,但这样应该会更好。

lndjwyie

lndjwyie2#

终于找到了一个解决方案。由于某种原因cur.mogrify没有给我正确的sql字符串插入。创建了我自己的SQl字符串,它的工作速度比cur.executeall()快得多

list_size = len(mylist)

for len in range(0,list_size):
    if ( len != list_size-1 ):
        sql = sql + ' ('+ "'"+  mylist[len] + "'"+ ') ,'
    else:
        sql = sql + '('+ "'"+  mylist[len] + "'"+ ')'

cursor1.execute("INSERT into sample(domain) values " + sql)

谢谢你们的帮助!

相关问题