Python SQLAlchemy ORM - отражение таблицы * без * ограничения и отражения индекса

1

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

Благодарю.

Теги:
python-3.x
sqlalchemy

1 ответ

0
Лучший ответ

Кажется, что нет очевидного способа ограничить то, что происходит под обложками при отражении объекта базы данных, поэтому я нашел, что лучший и наиболее эффективный способ заключается в простом определении сопоставленных классов явно, как описано в документах, включая только требуемые столбцы, в отличие от всего.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню