如何使用SQLAlchemy设置SQLite PRAGMA语句

20

我希望使用SQLAlchemy将SQLite的.journal文件放在内存中以提高性能。我已经尝试了以下方法:

sqlite_db_engine = create_engine('sqlite:///%s' % str(dbname), connect_args = {'PRAGMA     journal_mode':'MEMORY', 'PRAGMA synchronous':'OFF', 'PRAGMA temp_store':'MEMORY', 'PRAGMA cache_size':'5000000'})

db = sqlite_db_engine.connect()

并且这个:

sqlite_db_engine = create_engine('sqlite:///%s' % str(dbname))

db = sqlite_db_engine.connect()
db.execute("PRAGMA journal_mode = MEMORY")
db.execute("PRAGMA synchronous = OFF")
db.execute("PRAGMA temp_store = MEMORY")
db.execute("PRAGMA cache_size = 500000")

我尝试了很多方法,但都无法解决问题。对于长时间运行的事务,我仍然可以看到磁盘上创建了 .journal 文件。是否有其他方法可以解决这个问题?

*注意:我使用内置的Python SQLite模块没有问题。


我也尝试添加一个监听器,就像这个线程所说的那样:https://dev59.com/hHE85IYBdhLWcg3wx2n2 - tomc
当我尝试使用你的代码时,我遇到了错误DBAPIError: (TypeError) 'PRAGMA cache_size' is an invalid keyword argument for this function None None。你是否也遇到了同样的错误? - Nilesh
我没有收到任何错误,代码执行得很好,但显然什么也没做。 - tomc
3个回答

17

1
有没有一种方法可以根据目标数据库(例如SQLite3 vs MySQL vs PostgreSQL)注册不同的监听器,或者至少在进入监听器主体后将它们区分开来(即以编程方式检查这一点的方法)? - code_dredd
这在 sqlalchemy 中怎么使用呢? - Nimrod Mpandari
为什么这比 OP 提供的简单代码更好?为什么需要事件? - static_rtti

9

基本上,您应该能够重写有关外键的示例以实现您想要的功能。请查看 https://dev59.com/hHE85IYBdhLWcg3wx2n2#7831210

engine = create_engine(database_url)

def _fk_pragma_on_connect(dbapi_con, con_record):
    dbapi_con.execute('PRAGMA journal_mode = MEMORY')
    # ...

from sqlalchemy import event
event.listen(engine, 'connect', _fk_pragma_on_connect)

1

之前的两个解决方案都没有起作用,所以我找到了另一个解决方案

from sqlalchemy.interfaces import PoolListener
class MyListener(PoolListener):
    def connect(self, dbapi_con, con_record):
        dbapi_con.execute('pragma journal_mode=OFF')
        dbapi_con.execute('PRAGMA synchronous=OFF')
        dbapi_con.execute('PRAGMA cache_size=100000')

engine = create_engine('sqlite:///' + basefile,echo=False, listeners= [MyListener()])

3
在最近的版本中,这将会产生一个警告信息:SADeprecationWarning: 对于Pool (和create_engine())函数,'listeners'参数已被弃用。使用event.listen()代替。 - jpoppe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接