如何通过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()
答案 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)