将列表或元组插入 table 而无需迭代到 postgresql
Insert list or tuple into table without iteration into postgresql
我是 python 的新手。我想要实现的是将 list/tuple 中的值插入到我的 redshift table 中,而没有 iteration.I 大约有 100 万行和 1 列。
下面是我用来创建 list/tuple.
的代码
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)
的输出如下。
List output
['friv.com', 'steep.tv', 'wordpress.com', 'fineartblogger.net',
'v56.org']
Tuple Output
('friv.com', 'steep.tv', 'wordpress.com',
'fineartblogger.net', 'v56.org')
现在,下面是我用来将值插入到我的 redshift table 中的代码,但出现错误:
cursor2.execute("INSERT INTO sample(domain) VALUES (%s)", mylist) or
cursor2.execute("INSERT INTO sample(domain) VALUES (%s)", mytuple)
Error - not all arguments converted during string formatting
感谢任何帮助。如果需要任何其他详细信息,请告诉我,我将编辑我的问题。
更新 1:
尝试使用以下代码并出现不同的错误。
args_str = ','.join(cur.mogrify("(%s)", x) for x in mylist)
cur.execute("INSERT INTO table VALUES " + args_str)
ERROR - INSERT has more expressions than target columns
我想你在找 Fast Execution helpers:
mylist=[('t1',), ('t2',)]
execute_values(cursor2, "INSERT INTO sample(domain) %s", mylist, page_size=100)
它的作用是将 %s 替换为 100 个值。我不确定您可以设置多高 page_size,但这应该会更高效。
终于找到解决办法了。出于某种原因 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)
感谢大家的帮助!
我是 python 的新手。我想要实现的是将 list/tuple 中的值插入到我的 redshift table 中,而没有 iteration.I 大约有 100 万行和 1 列。
下面是我用来创建 list/tuple.
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)
的输出如下。
List output
['friv.com', 'steep.tv', 'wordpress.com', 'fineartblogger.net', 'v56.org']
Tuple Output
('friv.com', 'steep.tv', 'wordpress.com', 'fineartblogger.net', 'v56.org')
现在,下面是我用来将值插入到我的 redshift table 中的代码,但出现错误:
cursor2.execute("INSERT INTO sample(domain) VALUES (%s)", mylist) or
cursor2.execute("INSERT INTO sample(domain) VALUES (%s)", mytuple)
Error - not all arguments converted during string formatting
感谢任何帮助。如果需要任何其他详细信息,请告诉我,我将编辑我的问题。
更新 1:
尝试使用以下代码并出现不同的错误。
args_str = ','.join(cur.mogrify("(%s)", x) for x in mylist)
cur.execute("INSERT INTO table VALUES " + args_str)
ERROR - INSERT has more expressions than target columns
我想你在找 Fast Execution helpers:
mylist=[('t1',), ('t2',)]
execute_values(cursor2, "INSERT INTO sample(domain) %s", mylist, page_size=100)
它的作用是将 %s 替换为 100 个值。我不确定您可以设置多高 page_size,但这应该会更高效。
终于找到解决办法了。出于某种原因 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)
感谢大家的帮助!