2012-06-27 34 views
3

在從Internet下載數據並將它們放入SQLite數據庫的腳本中,我遇到了Python和SQLite的問題。在執行開始時,我打開連接並分配光標。然後將該遊標發送到下載數據並將其寫入數據庫的方法。到目前爲止,我知道create_schema方法正在工作,因爲數據庫是使用正確的結構創建的,其他方法似乎失敗了,但在腳本中執行時不會產生錯誤。我試圖使用sqlite3 termninal工具進入數據庫,並從表中選擇值,但select *返回空結果。我不太確定光標如何與方法一起工作,但希望在這裏發佈它可以幫助我獲得更好的理解。預先感謝您的幫助。SQLite和Python。一旦程序終止,值寫入沒有錯誤,但不在數據庫中

(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 

回答

10

從我看到的你最後不要調用commit()。這可能不會將任何數據寫入數據庫。 從SQLITE3文檔:

Connection.commit()

此方法提交當前事務。如果 不調用此方法,則自從上次調用 commit()以來執行的任何操作都不可見於其他數據庫連接。如果您想知道爲什麼您沒有看到您寫入數據庫的數據,請 檢查您是否忘記調用此方法。

+0

非常感謝。這解決了問題:) – olovholm

相關問題