2017-03-06 4 views
5

私はデータ項目を取得するScrapyのWebスクレーパーを持っています。私はそれらをデータベースに非同期的に挿入したい。例えばデータベースへのノンブロッキングスクリーニングパイプライン

、私はSQLAlchemyのコアを使用して、私のDBにいくつかの項目を挿入するトランザクションを持っている:

def process_item(self, item, spider): 
    with self.connection.begin() as conn: 
     conn.execute(insert(table1).values(item['part1']) 
     conn.execute(insert(table2).values(item['part2']) 

私はそれがalchimiaとツイストと非同期SQLAlchemyのコアを使用することが可能だということを理解しています。 alchimiaのドキュメントコード例は次のとおりです。

私が理解できないことは、上記のコードをalchimiaフレームワークでどのように使用できるかです。原子炉を使用するには、どうすればprocess_itemを設定できますか?

私はこれを行うことはできますか?

@inlineCallbacks 
def process_item(self, item, spider): 
    with self.connection.begin() as conn: 
     yield conn.execute(insert(table1).values(item['part1']) 
     yield conn.execute(insert(table2).values(item['part2']) 

リアクタ部品はどのように記述しますか?

また、Scrapyパイプラインで非ブロッキングデータベースを挿入する方が簡単ですか?


参考のため、ここではalchimiaのドキュメントからのコード例は次のとおりです。私は原子炉を使用するprocess_itemを設定するにはどうすればよい

from alchimia import TWISTED_STRATEGY 

from sqlalchemy import (
    create_engine, MetaData, Table, Column, Integer, String 
) 
from sqlalchemy.schema import CreateTable 

from twisted.internet.defer import inlineCallbacks 
from twisted.internet.task import react 


@inlineCallbacks 
def main(reactor): 
    engine = create_engine(
     "sqlite://", reactor=reactor, strategy=TWISTED_STRATEGY 
    ) 

    metadata = MetaData() 
    users = Table("users", metadata, 
     Column("id", Integer(), primary_key=True), 
     Column("name", String()), 
    ) 

    # Create the table 
    yield engine.execute(CreateTable(users)) 

    # Insert some users 
    yield engine.execute(users.insert().values(name="Jeremy Goodwin")) 
    yield engine.execute(users.insert().values(name="Natalie Hurley")) 
    yield engine.execute(users.insert().values(name="Dan Rydell")) 
    yield engine.execute(users.insert().values(name="Casey McCall")) 
    yield engine.execute(users.insert().values(name="Dana Whitaker")) 

    result = yield engine.execute(users.select(users.c.name.startswith("D"))) 
    d_users = yield result.fetchall() 
    # Print out the users 
    for user in d_users: 
     print "Username: %s" % user[users.c.name] 

if __name__ == "__main__": 
    react(main, []) 

答えて

関連する問題