Я хотел бы использовать ORM SQLAlchemy для Reflect (называемый в документах как "Отражение объектов базы данных") несколькими таблицами. Все, что меня интересует, отражает таблицу DDL, а не Index или Constraints - но это похоже на поведение по умолчанию.
Есть ли способ отключить, по-видимому, дефолтное индексирование и ограничение?
Это то, что я делаю:
from sqlalchemy import and_, create_engine, MetaData, Table
from sqlalchemy.orm import sessionmaker
conn_str = f'oracle://{user}:{pswd}@{srvc}'
engine = create_engine(conn_str, echo=True)
Session = sessionmaker(bind=engine)
meta = MetaData()
my_table = Table('my_table', meta, autoload=True, autoload_with=engine,
schema='my_schema')
С включенным echo=True
я могу ясно видеть, что связанные индексы и ограничения отражаются за кулисами. Я не хочу, чтобы это было сделано, учитывая ненужные вызовы базы данных и накладные расходы, которые она налагает на мое приложение. Как отключить отражение индексов и ограничений?
Благодарю.
Кажется, что нет очевидного способа ограничить то, что происходит под обложками при отражении объекта базы данных, поэтому я нашел, что лучший и наиболее эффективный способ заключается в простом определении сопоставленных классов явно, как описано в документах, включая только требуемые столбцы, в отличие от всего.
Base = declarative_base()
class Person(Base):
__tablename__ = 'person'
__table_args__ = {'schema': 'schema_name'}
person_id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
И тогда запрос может быть выполнен с использованием того же синтаксиса session.query()
, который будет использоваться с отражением базы данных, но сэкономит вам значительные накладные расходы на переходы в таблицы словаря базы данных.