我想我会尝试使我的sqlite数据库连接成为一个函数,而不是复制/粘贴连接和执行查询所需的~6行.我想让它变得多功能,所以我可以使用相同的功能来创建/选择/插入/等...
以下是我的尝试.'INSERT'和'CREATE TABLE'查询正在运行,但如果我执行'SELECT'查询,我如何处理它在函数外部获取的值?
通常我想打印它所取的值,也可以用它们做其他事情.
当我这样做时,我得到一个错误
Traceback (most recent call last):
File "C:\Users\steini\Desktop\py\database\test3.py", line 15, in <module>
for row in connection('testdb45.db', "select * from users"):
ProgrammingError: Cannot operate on a closed database.
Run Code Online (Sandbox Code Playgroud)
所以我猜连接需要打开,所以我可以从光标中获取值,但我需要关闭它,这样文件就不会总是被锁定.
这是我的测试代码:
import sqlite3
def connection (db, arg, cubby):
conn = sqlite3.connect(db)
conn.execute('pragma foreign_keys = on')
cur = conn.cursor()
cur.execute(arg)
for row in cur:
cubby.append(row)
conn.commit()
conn.close()
cubby=[]
connection('testdb.db', "create table users ('user', 'email')", cubby)
connection('testdb.db', "insert into users ('user', 'email') values ('joey', 'foo@bar')", cubby)
for row in connection('testdb45.db', "select * from users", cubby):
print row
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
编辑:稍微修改了代码,使得cur值被附加到外部列表,但仍然非常糟糕
mon*_*kut 16
我认为这个问题比起初看起来要困难一些.
您看到错误是因为您已在"连接"功能中关闭了与数据库的连接.
您可能最好创建一个DatabaseManagement类来管理单个连接.
就像是:
import sqlite3
class DatabaseManager(object):
def __init__(self, db):
self.conn = sqlite3.connect(db)
self.conn.execute('pragma foreign_keys = on')
self.conn.commit()
self.cur = self.conn.cursor()
def query(self, arg):
self.cur.execute(arg)
self.conn.commit()
return self.cur
def __del__(self):
self.conn.close()
Run Code Online (Sandbox Code Playgroud)
然后你应该能够做到这样的事情:
dbmgr = DatabaseManager("testdb.db")
for row in dbmgr.query("select * from users"):
print row
Run Code Online (Sandbox Code Playgroud)
这将在对象存在的持续时间内保持连接打开.
您仍然可能会发现这是一个更深层次的问题,但请一起玩,看看哪些对您有用.