我正在尝试将一个相当大的csv文件(21列/ 125k行)导入Postgresql。因为你不能像使用Sqlite那样在Postgres中插入一个空字符串。我试图用csvDictReader对每一行进行排序并过滤数据,以便为包含数据的列/文件创建一个Insert语句。排序工作正常,但是当我尝试创建insert语句时,它会尝试插入数组而不是每个值...请不要建议其他方式,如Postgresql的副本等等。谢谢
with codecs.open(filename, 'rb', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile, delimiter='\t')
a=0
col=[]
val=[]
for row in reader:
if a>0:
for column, value in row.items():
if value != '':
#print column, value
col.append(column)
val.append(value)
try:
c.execute('''INSERT INTO AMA (%s) VALUES (%s) ON CONFLICT DO NOTHING''',(col,val,))
except psycopg2.IntegrityError as e:
print e
col=[]
val=[]
a=a+1
psycopg2.ProgrammingError:“ARRAY”或附近的语法错误 第1行:插入AMA(ARRAY ['fulfillment-id','sku','settleme ...
管理到目前为止,但现在出现了另一个问题:
with codecs.open(filename, 'rb', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile, delimiter='\t')
a=0
col=[]
val=[]
for row in reader:
for column, value in row.items():
if value != '':
col.append(column)
val.append(value)
try:
query='''INSERT INTO AMA %s VALUES %s ON CONFLICT DO NOTHING'''
print c.mogrify(query, (tuple(col), tuple(val)))
c.execute(query, (tuple(col), tuple(val),))
except psycopg2.IntegrityError as e:
print e
col=[]
val=[]
a=a+1
psycopg2.ProgrammingError:“'currency'或附近的语法错误” 第1行:插入AMA('货币','结算ID','deposit-da
看起来我需要在Postregsql中的列名称周围而不是''。我可以做些什么来改变它?
找到一个有效的解决方案,如果有任何关于如何提高速度的想法,比如执行许多等,请告诉我..
with codecs.open(filename, 'rb', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile, delimiter='\t')
a=0
col=[]
val=[]
for row in reader:
for column, value in row.items():
if value != '':
col.append(column)
val.append(unicode(value, "utf8"))
try:
query1=sql.SQL("INSERT INTO AMA ({}) VALUES ({}) ON CONFLICT DO NOTHING").format(sql.SQL(', ').join(map(sql.Identifier, col)),sql.SQL(', ').join(sql.Placeholder() * len(col)))
query=c.mogrify(query1, tuple(val),)
#print query
c.execute(query)
except psycopg2.IntegrityError as e:
print e
col=[]
val=[]
a=a+1
答案 0 :(得分:0)
使用psycopg2的SQL函数,可以使用"中的表格以正确的格式创建sql。 " '和值',那么只需要创建包含数据的表和值的列表。