Как установить SQLite PRAGMA с помощью SQLAlchemy
Я бы хотел, чтобы 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, создаваемый на диске. Есть ли другой способ установить это?
* note У меня нет проблем с этим с помощью встроенного модуля sqlite python.
Ответы
Ответ 1
Как насчет использования событий:
from sqlalchemy.engine import Engine
from sqlalchemy import event
@event.listens_for(Engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
cursor = dbapi_connection.cursor()
cursor.execute("PRAGMA journal_mode=WAL")
cursor.close()
См. http://docs.sqlalchemy.org/en/rel_0_9/dialects/sqlite.html#foreign-key-support
Ответ 2
В принципе, вы должны иметь возможность переписывать примеры для foreignkey для достижения того, чего вы хотите. Взгляните на fooobar.com/questions/213591/...
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)
Ответ 3
Два предыдущих решения не работали, поэтому я нашел еще один.
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()])