2017-04-12 14 views
-1

私はデータベースを照会する(SQLAlchemyを使用して)マルチスレッドのデータ解析パイプラインを持っています。さらに、データベースは複数のシステム間でsyncthingによって同期化されています。つまり、ストーリーが短いため、書き込み権限が常に保証されるわけではありません。SQLAlchemy - データベースの書き込み/ロックなしのクエリ

私は書き込みアクセスを保証することができる午前ときであっても、私はまだ時折、かなりランダムに取得する操作ミス:

def loadSession(db_path): 
    db_path = "sqlite:///" + path.expanduser(db_path) 
    engine = create_engine(db_path, echo=False) 
    Session = sessionmaker(bind=engine) 
    session = Session() 
    Base.metadata.create_all(engine) 
    return session, engine 

OperationalError: (sqlite3.OperationalError) database is locked 

私は、クエリのためのセッションをロードするために使用するコードは以下のとおりです。

そしてその完全な文脈で見ることができますhere

私のクエリ(と私は値にそれを回す方法)は次のようになります。

session, engine = loadSession(db_path) 
    sql_query=session.query(LaserStimulationProtocol).filter(LaserStimulationProtocol.code==stim_protocol_dictionary[scan_type]) 
    mystring = sql_query.statement 
    mydf = pd.read_sql_query(mystring,engine) 
    delay = int(mydf["stimulation_onset"][0]) 

そして再び、完全なコンテキストがhereを見つけることができます。

書き込み可能/ロック解除されているファイルに頼ることなくデータベースを照会できるように、コードを変更するにはどうすればよいですか?私はファイルのチェックサムをチェックしていますが、それはクエリー時に変更されないので、明らかに何も書いていません。このように、私は書き込みアクセスなしで探している情報を抽出するいくつかの方法があるはずですね?

答えて

-1

私は問題のいくつかの詳細な説明と、それを回避するいくつかの方法を提供して被写体にブログ記事を書いた:http://charlesleifer.com/blog/multi-threaded-sqlite-without-the-operationalerrors/

ピーウィーORMは、Aへの書き込みを複数のスレッドをサポートするように設計された拡張子を持ちますSQLiteデータベース。 http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#sqliteq

+0

あなたがPeeweeの使用に興味がないなら、私は理解しています - ブログ記事には、SQLiteでのロックとトランザクション管理の複雑さが詳しく説明されています。 (または使用しない)。 – coleifer

+2

ここでは、コメントを残していないことをお詫びします。なぜ、私はピーエーとは何の関係もありません。理由はこれがかなり[リンクのみの回答](https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers)であるということでした。私はあなたがここであなた自身を引用することに無関心かもしれないことを理解しますが、基本を得るためにユーザがリンクをたどる必要がない場合、このサイトをより良く提供します。答え自体は、よく読んで、さらに読むことへのリンクを持っていなければなりません。また、リンクの腐敗が問題です。 –

+0

明確にしていただきありがとうございます - 私は建設的なフィードバック(およびdownvoteが公正と思われる)を感謝します。再度、感謝します! – coleifer

関連する問題