sqlalchemy, можно ли обойтись созданием таблиц классов? - PullRequest
0 голосов
/ 12 февраля 2019

Я недавно узнал о sqlalchemy в Python.Я хотел бы использовать его для науки о данных, а не для веб-приложений.
Я читал об этом, и мне нравится, что вы можете переводить 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
...