微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLite和Python值写入无错误,但程序终止后不会写入数据库

如何解决SQLite和Python值写入无错误,但程序终止后不会写入数据库

从我看来,您最后不会调用commit()。但是,这可能不会将任何数据写入数据库。从sqlite3文档中:

Connection.commit()

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

解决方法

我在脚本和Python中遇到了问题,该脚本从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,til)
        cur.execute("""INSERT INTO sesjoner(fra,til) VALUES(%s,%s,%s)""" % (fra,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');""" % (emne_id,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,'%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,'%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,'%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,foedselsdato,kjoenn,fylke,parti) VALUES('%s','%s');""" % (doedsdato,repr_id,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),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),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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。