2017-03-06 60 views
5

Mam skrobaczkę internetową w aplikacji Scrapy, która pobiera elementy danych. Chcę również asynchronicznie wstawiać je do bazy danych.Nieblokujący rurociąg Scrapy do bazy danych

Na przykład, mam transakcję, która wstawia pewne elementy do mojego db przy użyciu sqlalchemy Rdzeń:

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']) 

Rozumiem, że jest to możliwe do wykorzystania sqlalchemy Rdzeń asynchronicznie z wykrzywioną alchimia. Poniżej znajduje się przykład kodu dokumentacji dla alchimia.

Czego nie rozumiem, to w jaki sposób mogę użyć powyższego kodu w strukturze alchimia. Jak skonfigurować process_item do korzystania z reaktora?

Czy mogę zrobić coś takiego?

@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']) 

Jak napisać część reaktora?

Czy istnieje prostszy sposób na niezablokowanie wstawiania bazy danych w rurociągu Scrapy?


Dla porównania, tutaj jest przykład kodu z dokumentacji alchimia „s:

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, []) 

Odpowiedz