我需要一种方法来访问在我的python3应用程序中在内存中创建的数据库(':memory:')在命令行界面工具sqlite3中。这个想法是为用户提供标准sqlite3工具的便利,而不是在python本身重新实现sqlite shell。
同样,目标是:
数据库在我的内存中的python程序中打开 - >在sqlite3 cli工具中编辑/处理数据库 - >将(可能)修改过的数据库移回我的python程序。
我尝试过:
def sqlite_cli(self):
# Spawn the original sqlite3 cli interface
# Dump the database in a named temporary file. Read it back into
# memory. At close() the tempfile will be erased.
with tempfile.NamedTemporaryFile(delete=True) as tf:
for line in self.connection.iterdump():
tf.write(bytes(line, 'ascii'))
# Work with the database through sqlite3
subprocess.call(['sqlite3', '-init', tf.name])
# Read the potentially modified database
# !!!!!!!!!!!!!!!!
# Here happens the logic gap: The sqlite3 tool doesn't
# save modifications to the file opend as the -init argument.
# How can I save the modifications done within sqlite3 as a
# sql text file ready to be read back into the app?!
tf.seek(0)
edited_db = tf.read()
# Delete all tables residing in memory
try:
for t in ACCMAN_TABLES:
self.cursor.execute('DROP TABLE IF EXISTS %s' % t)
self.connection.commit()
# Add the (maybe) edited one
self.cursor.executescript(edited_db.decode(encoding='utf-8'))
self.connection.commit()
except sqlite3.Error as e:
logger.error("sqlite_cli(): %s" % e.args[0])
tf.close()
在这种情况下,我需要一种方法来保存用 sqlite -init filename 打开的数据库所做的所有修改,无论是以sql还是二进制(正常的...)格式在文件系统上。
编辑:一个解决方案是让用户在数据库上做他的东西,然后在他结束会话之前(捕获stq for .q .quit .exit),我可以发送一个中介
.output outfile.sql
.dump
.quit
在文件系统上重定向整个数据库(以及它的修改!),然后将创建的文件读回python应用程序。但这太丑陋了......
答案 0 :(得分:0)
我认为你不会喜欢这个答案,但我会考虑在你的应用程序中将“模型”写成能够接收xml-rpc调用的“服务器”。这样,您的“控制器”(以及外部控制器)可以访问数据库并执行您允许的任何操作。将类的方法公开为XML-RPC服务器非常容易。见http://docs.python.org/2/library/xmlrpclib.html?highlight=xmlrpc#xmlrpclib