sqlalchemy,我可以绕开创建表类吗?

时间:2019-02-11 23:02:08

标签: python sqlalchemy dbtable

我最近在Python中发现了有关sqlalchemy的信息。我想将其用于数据科学而非网站应用程序。
我一直在阅读有关它,我希望您可以将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

0 个答案:

没有答案