使用sqlite3执行前处理和后处理

时间:2013-09-13 09:15:30

标签: python sqlite

如何通过python在我的SQL3数据库上执行后期处理?以下代码不起作用,但我要做的是首先创建一个新数据库(如果不存在),然后插入一些数据,最后执行查询并关闭连接。但是我要分别做什么,以便稍后添加其他功能,例如删除/更新程序/等......任何想法?

class TitlesDB:
    # initiate global variables
    conn = None
    c = None
    # perform pre - processing
    def __init__(self, name):
        import os
        os.chdir('/../../')
        import sqlite3
        conn = sqlite3.connect(name)
        c = conn.cursor()
        c.execute('CREATE TABLE IF NOT EXISTS titles (title VARCHAR(100) UNIQUE)')
    # insert a bunch of new titles
    def InsertTitles(self, list):
        c.executemany('INSERT OR IGNORE INTO titles VALUES (?)', list)
    # perform post - processing
    def __fina__(self):
        conn.commit()
        conn.close()

2 个答案:

答案 0 :(得分:0)

首先,避免在__init__内部建立sql连接不是更好吗? 如果要在使用__fina__后在同一实例中使用此类,则会出现问题。 您可以在另一个方法中使用它并调用它并在需要时调用连接关闭方法并在执行每个方法后提交。

这是我使用的:创建一个连接到db并从参数执行查询的类方法,提交和关闭连接,并传递您想要作为该方法的参数执行的任何查询。您可以简单地调用此方法方法随时随地。 最好的是,您可以创建一个方法,在关闭数据库连接之前将多个查询作为参数传递。 如果每次需要执行sql查询时必须使用sql连接到另一个类中的同一个db而不使用一组方法,这是特别有用的。

这是我在MySQLdb模块中使用的一个小例子,它非常简单,但它有效。

import MySQLdb

class DbQuery:
    '''Here is the class I talked about'''
    def __init__(self):
        '''You can define the main queries here but it's not necessary
           They can be global variables
           If you don't have class dependency from which you get variables
           you might not even need to define __init__'''
    def Sql_Connect(self):
        self.db = MySQLdb.connect("localhost","root","","data_db" )
        self.cursor = db.cursor()
    def Sql_Commit(self):
        self.db.commit()
        print "Info : Database updated"
        except:
           self.db.rollback()
           print "Error : Database rollback"
        self.db.close()
    def Query(self,query):
        self.Sql_Connect()
        try :
            self.cursor.execute(query)
        self.Sql_Commit()

唯一重要的是要记住查询结构。

答案 1 :(得分:0)

您可以创建一个上下文管理器来进行预处理和后处理。

import contextlib

@contextlib.contextmanager
def titles_cursor():
    # perform pre - processing
    conn = sqlite3.connect(name)
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS titles (title VARCHAR(100) UNIQUE)')

    yield c

    # perform post - processing
    conn.commit()
    conn.close()

with声明中使用它:

with titles_cursor() as c:        
    c.executemany('INSERT OR IGNORE INTO titles VALUES (?)', list)