3

我在一个脚本中遇到了 Python 和 SQLite 的问题,该脚本从 Internet 下载数据并将它们放入 SQLite 数据库。在执行开始时,我打开连接并分配光标。然后将该游标发送到下载数据并将其写入数据库的方法。到目前为止,我知道 create_schema 方法正在工作,因为数据库是使用正确的结构创建的,其他方法似乎失败了,但在脚本中执行时不会引发错误。我尝试使用 sqlite3 终端工具进入数据库并从表中选择值,但 select * 返回一个空结果。我不太确定光标如何与方法一起使用,但希望将其发布在这里将帮助我更好地理解。提前感谢您的帮助。

(PS:对缩进感到抱歉。我没有找到一种很好的方法来一次性对所有文本进行缩进。关于如何做到这一点的任何提示?)

脚本:

# -*- coding: UTF-8 -*-
import sqlite3
import httplib
import urllib2
import os
from xml.dom import minidom, Node
from xml.etree import ElementTree

SITE = "http://data.stortinget.no/eksport/"
DATA = "data.db"

def get_perioder(cur):
    DOK = "stortingsperioder"
    try:
        page = urllib2.urlopen(SITE+DOK)
    except:
        print "Failed to fetch item "+DOK
   if page:
    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[2]
    elements = list(top)
    for el in elements:
        fra = el.find('{http://data.stortinget.no}fra').text
        per_id = el.find('{http://data.stortinget.no}id').text
        til = el.find('{http://data.stortinget.no}til').text
        print "id: %s fra: %s til: %s" % (per_id, fra, til)
        cur.execute("""INSERT INTO perioder(fra, id, til) VALUES('%s','%s','%s')""" % (fra, per_id, til))
else:
    print "Could not load page: "+DOK
return cur

def get_sesjoner(cur):
DOK = "sesjoner"
try:
     page = urllib2.urlopen(SITE+DOK)
except:
    print "Failed to fetch item "+DOK
if page:
    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[2]
    elements = list(top)
    for el in elements:
        fra = el.find('{http://data.stortinget.no}fra').text
        ses_id = el.find('{http://data.stortinget.no}id').text
        til = el.find('{http://data.stortinget.no}til').text
        assert attribute in (fra, ses_id, til)
        print "id: %s fra: %s til: %s" % (ses_id, fra, til)
        cur.execute("""INSERT INTO sesjoner(fra, id, til) VALUES(%s, %s, %s)""" % (fra, ses_id, til))
else:
    print "Could not load page: "+DOK
return cur

def get_emner(cur):
DOK = "emner"
try:
     page = urllib2.urlopen(SITE+DOK)
except:
    print "Failed to fetch item "+DOK

if not page:
    print "Could not load page:!! "+DOK
    return
tree = ElementTree.parse(page)
root = tree.getroot()
top = list(root)[1]
elements = list(top)
for el in elements:
    navn = el.find('{http://data.stortinget.no}navn').text
    main_emne_id = el.find("{http://data.stortinget.no}id").text
    print "HOVED: %s %s" % (navn, main_emne_id)
    cur.execute("""INSERT INTO hovedemner(id, navn) VALUES('%s','%s');""" % (main_emne_id, navn))
    if("true" in el.find("{http://data.stortinget.no}er_hovedemne").text):
        for uel in el.find("{http://data.stortinget.no}underemne_liste"):
            navn = uel.find("{http://data.stortinget.no}navn").text
            emne_id = uel.find("{http://data.stortinget.no}id").text
            print "UNDER: %s %s, horer til: %s" % (navn, emne_id, main_emne_id)
            cur.execute("""INSERT INTO underemner(id, navn, hovedemne_id) VALUES('%s', '%s', '%s');""" % (emne_id, navn, main_emne_id))
return cur


def get_fylker(cur):
DOK = "fylker"
try:
     page = urllib2.urlopen(SITE+DOK)
except:
    print "Failed to fetch item "+DOK

tree = ElementTree.parse(page)
root = tree.getroot()
top = list(root)[1]
elements = list(top)
for el in elements:
    fylke_id = el.find("{http://data.stortinget.no}id").text
    navn =  el.find("{http://data.stortinget.no}navn").text
    print ("id: %s, navn: %s") % (fylke_id, navn)
    cur.execute("""INSERT INTO fylker(id, navn) VALUES('%s','%s');""" % (fylke_id, navn))

return cur


def get_partier(cur):
DOK = "allepartier"
try:
     page = urllib2.urlopen(SITE+DOK)
except:
    print "Failed to fetch item "+DOK

tree = ElementTree.parse(page)
root = tree.getroot()
top = list(root)[1]
elements = list(top)
for el in elements:
    parti_id = el.find("{http://data.stortinget.no}id").text
    navn =  el.find("{http://data.stortinget.no}navn").text
    print ("id: %s, navn: %s") % (parti_id, navn)
    cur.execute("""INSERT INTO partier(id, navn) VALUES('%s','%s');""" % (parti_id, navn))

return cur

def get_komiteer(cur):
DOK = "allekomiteer"
try:
     page = urllib2.urlopen(SITE+DOK)
except:
    print "Failed to fetch item "+DOK

tree = ElementTree.parse(page)
root = tree.getroot()
top = list(root)[1]
elements = list(top)
for el in elements:
    kom_id = el.find("{http://data.stortinget.no}id").text
    navn = el.find("{http://data.stortinget.no}navn").text
    print "id: %s navn: %s" % (kom_id, navn)
    cur.execute("""INSERT INTO partier(id, navn) VALUES('%s','%s');""" % (kom_id, navn))
return cur


def get_representanter(cur):
DOK = "dagensrepresentanter"
try:
     page = urllib2.urlopen(SITE+DOK)
except:
    print "Failed to fetch item "+DOK

tree = ElementTree.parse(page)
root = tree.getroot()
top = list(root)[1]
elements = list(top)
for el in elements:
    doedsdato = el.find("{http://data.stortinget.no}doedsdato").text
    etternavn = el.find("{http://data.stortinget.no}etternavn").text
    foedselsdato = el.find("{http://data.stortinget.no}foedselsdato").text
    fornavn = el.find("{http://data.stortinget.no}fornavn").text
    repr_id = el.find("{http://data.stortinget.no}id").text
    kjoenn = el.find("{http://data.stortinget.no}kjoenn").text
    fylke = el.find("{http://data.stortinget.no}fylke/{http://data.stortinget.no}id").text
    parti = el.find("{http://data.stortinget.no}parti/{http://data.stortinget.no}id").text
    #komiteer = el.find("{http://data.stortinget.no}komiteer_liste/{http://data.stortinget.no}komite/{http://data.stortinget.no}id").text
    print "repr: %s, %s %s, parti: %s, fylke: %s" % (repr_id, fornavn, etternavn, parti, fylke)
    cur.execute("""INSERT INTO representanter(doedsdato, etternavn, foedselsdato, fornavn, id, kjoenn, fylke, parti) VALUES('%s','%s','%s','%s','%s','%s','%s','%s');""" % (doedsdato, etternavn, foedselsdato, fornavn, repr_id, kjoenn, fylke, parti))

return cur

def create_schema(cur):
cur.execute("DROP TABLE IF EXISTS perioder")
perioder = "CREATE TABLE  perioder(fra varchar(255), id varchar(255), til varchar(255))"
cur.execute("DROP TABLE IF EXISTS sesjoner")
sesjoner = "CREATE TABLE sesjoner(fra varchar(255), id varchar(255), til varchar(255))"
cur.execute("DROP TABLE IF EXISTS hovedemner")
hovedemner = "CREATE TABLE hovedemner(id int, navn varchar(255));"
cur.execute("DROP TABLE IF EXISTS underemner")
underemner = "CREATE TABLE underemner(id int, navn varchar(255), hovedemne_id int)"
cur.execute("DROP TABLE IF EXISTS fylker")
fylker = "CREATE TABLE fylker(id varchar(255), navn varchar(255));"
cur.execute("DROP TABLE IF EXISTS partier")
partier = "CREATE TABLE partier(id varchar(255), navn varchar(255));"
cur.execute("DROP TABLE IF EXISTS komiteer")
komiteer = "CREATE TABLE komiteer(id varchar(255), navn varchar(255));"
cur.execute("DROP TABLE IF EXISTS representanter")
representanter = "CREATE TABLE representanter(doedsdato varchar(255), etternavn varchar(500), foedselsdato varchar(255), fornavn varchar(500), id varchar(255), kjoenn varchar(255), fylke varchar(255), parti varchar(255));"
cur.execute(perioder)
cur.execute(sesjoner)
cur.execute(hovedemner)
cur.execute(underemner)
cur.execute(fylker)
cur.execute(partier)
cur.execute(komiteer)
cur.execute(representanter)
return cur


if __name__ == "__main__":
conn = sqlite3.connect(DATA)
cur = conn.cursor()
cur = create_schema(cur) 
cur = get_perioder(cur)
cur = get_sesjoner(cur)
cur = get_emner(cur)
cur = get_fylker(cur)
cur = get_partier(cur)
cur = get_komiteer(cur)
cur = get_representanter(cur)
conn.close
4

1 回答 1

10

据我所知,您最后不会调用 commit() 。不过,这可能不会将任何数据写入数据库。来自 SQLITE3 文档:

连接.commit()

此方法提交当前事务。如果您不调用此方法,则自上次调用 commit() 以来所做的任何事情都不会从其他数据库连接中看到。如果您想知道为什么看不到已写入数据库的数据,请检查您是否忘记调用此方法。

于 2012-06-27T12:00:25.820 回答