Python 在SQLAlchemy(sqlite)中从较大的数据库创建较小的数据库

Python 在SQLAlchemy(sqlite)中从较大的数据库创建较小的数据库,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我想从我得到的一个较大的db开始创建一个较小的db,我想用python和sqlalchemy来完成这一切 到目前为止,我已经做到了:我正在查询原始数据库,并在两个表(books和anatit)上执行联接,以过滤掉数据(原始数据库中还有许多我不需要的表)。我还希望市场交易表包含在较小的db中 engine = create_engine('sqlite:///D:/backtest_dbs/20191016_MIT.db') conn=engine.connect() metadata= Meta

我想从我得到的一个较大的db开始创建一个较小的db,我想用python和sqlalchemy来完成这一切

到目前为止,我已经做到了:我正在查询原始数据库,并在两个表(books和anatit)上执行联接,以过滤掉数据(原始数据库中还有许多我不需要的表)。我还希望市场交易表包含在较小的db中

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。大小约为250万行,因此我不确定是否会使用
.insert()
进行
for
循环。我首先创建另一个引擎,在另一个文件夹中创建较小的db。创建表的最佳方法是什么(在本例中,'best'表示pythonic/effective),我们可以从ResultProxy开始创建表,而不必在之后填充它们吗?那么市场交易表呢,我可以使用
autoload\u with=engine
将其添加到
enigne\u 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,我很乐意倾听。

对于那些感兴趣的人,当您有10^6个数据点时,您可以使用pandas(尤其是在我的情况下,您还想直接访问数据进行分析),这需要几秒钟

    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()
方法,我不知道这个方法。您还可以访问作为数据帧的小型数据库,因此可以根据需要进行修改/分析


如果有人想添加内容,我想知道更多信息(参见原始问题的最后一部分)。

我找到了一种使用熊猫的方法,我会尽快发布答案