2012-03-12 2 views
11

Я бы хотел, чтобы SQLAlchemy помещал SQLite .journal файл в память, чтобы ускорить работу. Я попытался это:Как установить SQLite PRAGMA с помощью SQLAlchemy

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, создаваемый на диске. Есть ли другой способ установить это?

* обратите внимание, у меня нет проблем делать это с помощью встроенного модуля

+0

Я также попытался добавить слушателя, как эту тему: http://stackoverflow.com/questions/2614984/sqlite-sqlalchemy-how-to-enforce-foreign-keys – tomc

+0

Я получил ошибку 'DBAPIError: (TypeError) «PRAGMA cache_size» является недопустимым аргументом ключевого слова для этой функции. Нет. «Нет, когда я пытаюсь использовать ваш код. Эта же ошибка вы получили? – Nilesh

+0

Я не получаю никаких ошибок, код выполняется отлично, но, по-видимому, ничего не делает. – tomc

ответ

5

питон SQLite В принципе вы должны быть в состоянии переписать примеры о ForeignKey, чтобы достичь того, чего вы хотите. Посмотрите на https://stackoverflow.com/a/7831210/1890086

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) 
0

Два предыдущих решения не получилось, так что я нашел the another one.

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()]) 
+1

В последних версиях это даст: SADeprecationWarning: аргумент 'listeners' для Pool (и create_engine()) устарел. Использовать event.listen() – jpoppe