Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用psycopg2将多行插入postgreSQL时出错_Python_Postgresql_Python 3.x_Xml Parsing_Psycopg2 - Fatal编程技术网

Python 使用psycopg2将多行插入postgreSQL时出错

Python 使用psycopg2将多行插入postgreSQL时出错,python,postgresql,python-3.x,xml-parsing,psycopg2,Python,Postgresql,Python 3.x,Xml Parsing,Psycopg2,我需要打开大量XML文件,然后对其进行处理以生成大量行,然后将这些行插入远程postgress数据库中的多个表中 为了提取XML数据,我使用XML.etree.ElementTree解析XML树并根据需要提取元素。当我在做很多事情时,基本的动作是获取一个特定的元素,无论是字符串还是整数,并将其放入一系列字典中 经过更多的处理后,我有一些字典需要插入到数据库中。对于任何单个xml文件,我可以在3个表中生成多达8-10000行(或查询) 在测试期间,我将输出到sql文件,然后手动运行查询。如果我有很

我需要打开大量XML文件,然后对其进行处理以生成大量行,然后将这些行插入远程postgress数据库中的多个表中

为了提取XML数据,我使用
XML.etree.ElementTree
解析XML树并根据需要提取元素。当我在做很多事情时,基本的动作是获取一个特定的元素,无论是字符串还是整数,并将其放入一系列字典中

经过更多的处理后,我有一些字典需要插入到数据库中。对于任何单个xml文件,我可以在3个表中生成多达8-10000行(或查询)

在测试期间,我将输出到sql文件,然后手动运行查询。如果我有很多xml文件,这显然是行不通的

因此,我尝试使用
psycopg2
来自动化这个过程。据我从堆栈溢出和其他地方了解,运行单个
execute
函数的速度非常慢。基于此,我尝试编写如下代码:

QueryData = ','.join(cur.mogrify('(%s,%s,%s)', row) for row in myData)
cur.execute('INSERT INTO DBTABLE' + QueryData)
cur.commit()
其中
myData
是元组列表
[(a,b,c),(a,b,c),(a,b,c)]
的内容是由
xml.etree.ElementTree
提取的数据和我自己计算的值的组合

当我试图实际执行上述代码时,却出现以下错误:

TypeError:序列项0:预期的str实例,找到的字节数

好的。。。如果我随后尝试将我的数据(每个元组元素)转换为
str()
,但我得到:

TypeError: encoding without a string argument
我是不是完全错了?我怎样才能做我需要的?我在用蟒蛇3

附加的

我被要求展示一个数据示例

这里是最简单的,将3个整数值放入一个表中。其形式为:
(文档id、项目索引、项目代码)

典型的例子是:
(937138681)

我的一般转换尝试是:

(str(document_id),str(item_index),str(item_code))
我也尝试过另一种方式:

(bytes(document_id,'utf-8'),bytes(item_index,'utf-8'),bytes(item_code,'utf-8'))

后者也会引发错误:
TypeError:encoding不带字符串参数

如果表名后缺少值,则其他内容似乎都是正确的:


cursorPG.execute(“插入测试值”“+”,”.join(cursorPG.mogrify(“(%s,%s)”,x)表示mydata中的x))

好,所以我让它工作了。。。然而,我对我的解决方案为什么有效感到困惑。我将其作为答案发布,但如果有人能向我解释发生了什么,那就太好了:

基本上:

QueryData = ','.join(cur.mogrify('(%s,%s,%s)', row) for row in myData)
cur.execute('INSERT INTO DBTABLE' + QueryData)
必须改为:

QueryData = b','.join(cur.mogrify(b'(%s,%s,%s)', row) for row in myData)
cur.execute(b'INSERT INTO DBTABLE' + QueryData)
这让我觉得很不雅观

表示对于cur.mogrify:

返回的字符串始终是字节字符串

因此,要使用这种方法,只需将mogrify的结果解码回字符串,例如:

QueryData = ','.join(cur.mogrify('(%s,%s,%s)', row).decode('utf-8') for row in myData)
cur.execute('INSERT INTO DBTABLE' + QueryData)
但是,如中所述,复制大量数据的最有效方法是使用。您可以使用任何“类似python文件的对象”来执行此操作。以下是psycopg文档中的一个示例:

>>> f = StringIO("42\tfoo\n74\tbar\n")
>>> cur.copy_from(f, 'test', columns=('num', 'data'))
>>> cur.execute("select * from test where id > 5;")
>>> cur.fetchall()
[(6, 42, 'foo'), (7, 74, 'bar')]

我们可以看到有问题的数据以及您如何转换它吗?好的,当然,我会添加这些数据,但这并不能解决问题。导致问题的行在执行之前<代码>查询数据=','。对于myData中的行,join(cur.mogrify('(%s,%s,%s'),row)仍然抛出类型错误