sqlalchemy
私は最近、Pythonについて知りました。Web アプリケーションではなく、データ サイエンスに使用したいと考えています。
私はそれについて読んでいて、SQLクエリをPythonに変換できるのが好きです。
私がやっていることについて私が混乱している主なことは次のとおりです。
すでに十分に確立されたスキーマからデータを読み取っているので、対応するモデルを自分で作成する必要がなかったらよかったのにと思います。
テーブルのメタデータを読み取ってから、テーブルと列をクエリするだけで回避できます。問題は、他のテーブルに参加したいときです。このメタデータの読み取りには毎回時間がかかりすぎるため、オブジェクトにピクルキャッシュするのが理にかなっているのか、それとも別の組み込みメソッドがあるのか 疑問に思っています。
編集: コードを含めます。待ち時間は、エンジンの使い方ではなく、読み込み機能のエラーによるものであることに気付きました。人々が有用なことをコメントした場合に備えて、コードを残します。乾杯。
私が使用しているコードは次のとおりです。
def reflect_engine(engine, update):
store = f'cache/meta_{engine.logging_name}.pkl'
if update or not os.path.isfile(store):
meta = alq.MetaData()
meta.reflect(bind=engine)
with open(store, "wb") as opened:
pkl.dump(meta, opened)
else:
with open(store, "r") as opened:
meta = pkl.load(opened)
return meta
def begin_session(engine):
session = alq.orm.sessionmaker(bind=engine)
return session()
次に、メタデータ オブジェクトを使用してクエリを取得します...
def get_some_cars(engine, metadata):
session = begin_session(engine)
Cars = metadata.tables['Cars']
Makes = metadata.tables['CarManufacturers']
cars_cols = [ getattr(Cars.c, each_one) for each_one in [
'car_id',
'car_selling_status',
'car_purchased_date',
'car_purchase_price_car']] + [
Makes.c.car_manufacturer_name]
statuses = {
'selling' : ['AVAILABLE','RESERVED'],
'physical' : ['ATOURLOCATION'] }
inventory_conditions = alq.and_(
Cars.c.purchase_channel == "Inspection",
Cars.c.car_selling_status.in_( statuses['selling' ]),
Cars.c.car_physical_status.in_(statuses['physical']),)
the_query = ( session.query(*cars_cols).
join(Makes, Cars.c.car_manufacturer_id == Makes.c.car_manufacturer_id).
filter(inventory_conditions).
statement )
the_inventory = pd.read_sql(the_query, engine)
return the_inventory