SQLALchemy自动映射多个数据库模式,并在向表中添加字段后刷新

2024-06-28 19:34:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我为现有数据库表创建了一个类,以便在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()

问候


Tags: selftablesbaseserversqlalchemybindconndatabase