Создайте базу данных меньшего размера из базы данных большего размера в SQLAlchemy (sqlite) - PullRequest
0 голосов
/ 08 января 2020

Я хочу создать меньший дБ, начиная с большего, который мне дали, и я хотел бы сделать все это в python с sqlalchemy.

Вот что у меня так далеко: I Я запрашиваю исходную базу данных и выполняю объединение двух таблиц (книги и анатит), чтобы отфильтровать данные (в исходной базе данных есть еще много таблиц, которые мне не нужны). Я также хочу, чтобы таблица market_trades была включена в меньшую базу данных.

engine = create_engine('sqlite:///D:/backtest_dbs/20191016_MIT.db')
conn=engine.connect()
metadata= MetaData()
books=Table('books',metadata, autoload=True, autoload_with=engine)
anatit=Table('anatit',metadata, autoload=True, autoload_with=engine)
market_trades=Table('market_trades',metadata, autoload=True, autoload_with=engine)
stmt=select([books,anatit.columns.CS,anatit.columns.isin,anatit.columns.desc])
stmt=stmt.select_from(anatit.join(books,anatit.columns.CS==books.columns.CS)).where(anatit.columns.desc.like('%BTP%'))
result_proxy=conn.execute(stmt)

Однако после выполнения инструкции я не уверен, что делать с ResultProxy. Размер составляет около 2,5 миллионов строк, поэтому я не уверен насчет for l oop с .insert(). Сначала я создаю другой движок, который создает меньшую базу данных в другой папке. Каков наилучший (в данном случае «лучший» означает питонический / эффективный) способ создания таблиц, и можем ли мы сделать это, начиная с ResultProxy, не заполняя их после? А как насчет таблицы market_trades, могу ли я использовать autoload_with=engine, чтобы добавить ее к enigne_small?

engine_small = create_engine('sqlite:///D:/backtest_dbs/small/20191016_MIT_small.db')
conn=engine_small.connect()
books=Table('books',metadata,...) # What goes in here?
anatit=Table('anatit',metadata,... )
market_trades=Table('market_trades',...) # Can I use autoload_with=engine, the larger db?
metadata.create_all(engine_small)

Я знаю, что есть и другие способы, которые не используют SQLAlchemy, но я подумал, что это будет хорошее упражнение и пример, и, кроме того, я делаю все в python в этом конкретном проекте, и я бы хотел, чтобы так и оставалось. Однако, если кто-то думает, что есть какие-то лучшие решения, которые вообще не используют SQLAlchemy, я с удовольствием выслушаю.

1 Ответ

0 голосов
/ 17 января 2020

Для тех, кто заинтересован, вы можете использовать pandas (особенно если, например, в моем случае вы также хотите получить прямой доступ к данным для анализа), когда у вас есть порядка 10 ^ 6 точек данных, это займет несколько секунд.

    engine = create_engine('sqlite:///D:/backtest_dbs/20191016_MIT.db')
    conn=engine.connect()
    metadata= MetaData()
    books=Table('books',metadata, autoload=True, autoload_with=engine)
    anatit=Table('anatit',metadata, autoload=True, autoload_with=engine)
    market_trades=Table('market_trades',metadata, autoload=True, autoload_with=engine)
    stmt=select([books,anatit.columns.CS,anatit.columns.isin,anatit.columns.desc])
    stmt=stmt.select_from(anatit.join(books,anatit.columns.CS==books.columns.CS)).where(anatit.columns.desc.like('%BTP%'))
    result_proxy=conn.execute(stmt)
    db_small=pd.DataFrame(result_proxy.fetchall())
    stmt2=select([market_trades])
    result_proxy2=conn.execute(stmt2)
    trades_df=pd.DataFrame(result_proxy2.fetchall())    
    engine_small = create_engine('sqlite:///D:/backtest_dbs/small/20191016_MIT_small.db', echo=True)
    trades_df.to_sql('market_trades', con=engine_small)
    db_small.to_sql('books', con=engine_small)
    result_proxy.close()
    result_proxy2.close()
    conn.close()

Приятной частью здесь является метод .to_sql(), о котором я не знал. У вас также есть доступ к маленькой базе данных в качестве кадра данных, так что вы можете изменить / проанализировать, если необходимо.

Хотелось бы узнать больше, если кто-то хочет добавить вещи (см. Последнюю часть исходного вопроса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...