SQLAlchemy Автоматически создает схему нескольких баз данных и обновляется после добавления поля в таблицу

#python #sqlalchemy #schema #refresh

Вопрос:

Я создаю класс для существующих таблиц базы данных, чтобы использовать сопоставление в SQLAlchemy

 def __init__(self, Server, Database, automap = False, tables = None):
    self.DRIVER     = '{SQL Server Native Client 11.0}'
    self.SERVERNAME = Server
    self.DATABASE   = Database
    self.conn_str   = (
        r'Driver='   self.DRIVER   ';'  
        r'Server='   self.SERVERNAME   ';' 
        r'Database='   self.DATABASE   ';' 
        r'Trusted_Connection=yes;' 
        )

    self.pyodbc = pyodbc.connect(self.conn_str)
    self.sqlalchemy_engine = sqla.create_engine("mssql pyodbc:///?odbc_connect=%s" % urllib.parse.quote_plus(self.conn_str)) #, echo=True)
    self.Session = sessionmaker(bind=self.sqlalchemy_engine, autoflush=True)
    self.session = self.Session()

    self.metadata = MetaData()
    if self.DATABASE == 'ACQ_RH_EXP':
        if tables != None:
            self.metadata.reflect(bind=self.sqlalchemy_engine, only=tables)
        else:
            self.metadata.reflect(bind=self.sqlalchemy_engine)
    else:
        schemas = {'Admin','dbo'}
        for s in schemas:
            self.metadata.reflect(bind=self.sqlalchemy_engine, schema=s)
    self.Base = automap_base(metadata = self.metadata)
    self.Base.prepare()
 

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

 vulcan.metadata.tables['Admin.ACQ_GEOLOGY_Q']
 

Мой вопрос таков:

  1. Правильно ли я создаю SQLAlchemy?
  2. Если я обновлю таблицу в своей базе данных, добавив поле, как мне затем «Обновить» классы SQLAlchemy, чтобы они содержали новый столбец таблицы.

В настоящее время я повторяю сопоставление, но, похоже, он не находит новый столбец

 for s in schemas:
        vulcan.metadata.reflect(bind=vulcan.sqlalchemy_engine, schema=s)
    vulcan.Base = automap_base(metadata = vulcan.metadata)
    vulcan.Base.prepare()
 

С уважением