2012-03-12 42 views
11

SQLAlchemyにSQLite .journalファイルをメモリ内に配置してパフォーマンスを向上させたいと思います。運でSQLAlchemyでSQLite PRAGMA文を設定するには

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

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

と、この:私はこれを試してみました。長いトランザクションの場合でも、ディスク上に.journalファイルが作成されていることがわかります。これを設定する別の方法がありますか?

*私は基本的にあなたが望むものを達成するためのForeignKeyについての例を書き換えることができるはずビルトインのpythonのsqliteモジュール

+0

また、私はこのスレッドのようにリスナーを追加しようとしました:http://stackoverflow.com/questions/2614984/sqlite-sqlalchemy-how-to-enforce-foreign-keys – tomc

+0

は私がエラー 'DBAPIErrorを得ました: (TypeError) 'PRAGMA cache_size'は、あなたのコードをユーザーにしようとすると、この関数の無効なキーワード引数です。None None'です。この同じエラーがありますか? – Nilesh

+0

私はエラーを起こさず、コードは正常に実行されますが、明らかに何もしません。 – tomc

答えて

5

でそれをやって何の問題もありません注意してください。イベントの使用に関する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

前の2つのソリューションを参照してください動作しませんでしたので、私は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:Pool(およびcreate_engine())の 'listeners'引数は非推奨です。 event.listen()を使用する – jpoppe

関連する問題