SQLAlchemy отразил классы в отдельных файлах

#python #class #reflection #sqlalchemy

#питон #класс #отражение #sqlalchemy

Вопрос:

Я новичок в алхимии, поэтому простите меня, если это основной вопрос. У меня есть табличные классы, которые отражены из существующей базы данных, и я хотел бы сохранить их в отдельном файле. Прямо сейчас у меня есть свои классы в верхней части моего основного приложения:

 engine = create_engine('mysql://' user ':' passwd '@' database, echo = False)
meta_data = MetaData(bind = engine, reflect = True)

Base = declarative_base()

class Table_1(Base):
    __table__ = Table('node_lmp', meta_data, autoload=True)
    def __init__(self, name):
        self.name = name

class Table2(Base):
    __table__ = Table('type_lmp', meta_data, autoload=True)
    def __init__(self, data, name):
        self.data = data
        self.name = name

Rest of application...
  

Я не уверен, как я могу экспортировать эти классы в отдельный модуль, поскольку они полагаются на метаданные из установленного соединения.

Я пытался экспериментировать с DeferredReflection безрезультатно. Я немного запутался в этом.

Ответ №1:

Например, давайте представим структуру каталогов следующим образом:

 MainDir/
   __init__.py
   main.py
   modelsDir/
      __init__.py
      meta.py
      modelA.py
  

Если вы хотите создать программу на Python из нескольких файлов, вам нужно __ init__.py -файл, оставьте его пустым. Он упаковывает другие файлы python, чтобы ваш main.py может их использовать, и они доступны для вызова.

В вашем meta.py вы можете сохранить эти переменные engine, meta_data и Base такими, какие они есть в вашем основном файле. В modelA.py вы можете вызвать эти метаданные следующим образом:

 from MainDir.modelsDir.meta import {
   engine,
   meta_data,
   Base
}
  

Импорт этих таблиц в main-file происходит точно так же, как описано выше. Более подробную информацию об импорте смотрите здесь: https://docs.python.org/2/tutorial/modules.html Вы можете импортировать переменные (движок и т.д.) И классы таким же образом.