Я недавно узнал о 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