[英]Python, insert XML data to sqlite3
我试图从URL中提取一些XML,解析它并将条目存储在sqlite3数据库中,我尝试了很多事情,但都失败了。 到目前为止,科德:
#!/usr/bin/env python
from urllib2 import urlopen
import gc
import xml.etree.ElementTree as ET
import sqlite3
rosetta_url = ("https://boinc.bakerlab.org/rosetta/team_email_list.php?teamid=12575&account_key=Y&xml=1")
root = ET.parse(urlopen(rosetta_url)).getroot()
cpids = [el.text for el in root.findall('.//user/cpid')]
print cpids
conn = sqlite3.connect("GridcoinTeam.db")
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS GRIDCOINTEAM (cpid TEXT)''')
c.executemany("INSERT INTO GRIDCOINTEAM VALUES (?);", cpids)
conn.commit()
conn.close()
conn = sqlite3.connect("GridcoinTeam.db")
c = conn.cursor()
cpids = c.execute('select cpid from GRIDCOINTEAM').fetchall()
conn.close()
print cpids
gc.collect()
我收到错误:
Incorrect number of bindings supplied. The current statement uses 1, and there are 32 supplied.
我尝试通过更改为插入元组
c.executemany("INSERT INTO GRIDCOINTEAM VALUES (?);", (cpids, ))
但这只是给:
Incorrect number of bindings supplied. The current statement uses 1, and there are 3289 supplied.
XML提取形式为['5da243d1f47b7852d372c51d6ee660d7','5a6d18b942518aca60833401e70b75b1','527ab53f75164864b74a89f3db6986b8'],但其中有数千个条目。
谢谢。
您需要将其作为多行而不是多列插入到一行中
cpids = [el.text for el in root.findall('.//user/cpid')]
cpids = zip(*[iter(cpids)]*1)
print cpids
问题出在
c.executemany("INSERT INTO GRIDCOINTEAM VALUES (?);", cpids)
这个executemany
需要一个元组列表,但是您传递一个字符串列表。 该代码有效执行的操作是:
for entry in cpids:
c.execute("INSERT INTO GRIDCOINTEAM VALUES (?);", *entry)
注意之前的明星entry
,其卸载字符串,它给你32+ PARAMS而你只想要一个。
为了解决这个问题,我们需要了解您的GRIDCOINTEAM
表架构。 如果您的表只有一列,并且要插入该列,则可以执行以下操作:
for entry in cpids:
c.execute("INSERT INTO GRIDCOINTEAM VALUES (?)", entry)
与executemany
相反, execute
将每个参数作为一个参数-没有元组,并在此处列出要卸载的参数。
另外,您可以使用executemany
,但随后需要将每个字符串包装在元组或生成器中:
c.executemany("INSERT INTO GRIDCOINTEAM VALUES (?);", [(i,) for i in cpids])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.