SQLAlchemy,使用反射和/或持久化反射的元数据和自动映射库生成python声明性_基类

SQLAlchemy,使用反射和/或持久化反射的元数据和自动映射库生成python声明性_基类,sqlalchemy,Sqlalchemy,我使用SQlAlchemy自动映射扩展作为首选,以避免手动编写声明性基类。主要是因为我不太熟悉db模式,只需要与一小部分表和列进行交互 我正在使用以下代码设置SQlAlchemy会话,然后与我的数据库交互。使用这个似乎效果很好 engine = create_engine('mssql+pymssql://xx:xxx@xxx/xxx', implicit_returning=False) metadata = MetaData() tables

我使用SQlAlchemy自动映射扩展作为首选,以避免手动编写声明性基类。主要是因为我不太熟悉db模式,只需要与一小部分表和列进行交互

我正在使用以下代码设置SQlAlchemy会话,然后与我的数据库交互。使用这个似乎效果很好

        engine = create_engine('mssql+pymssql://xx:xxx@xxx/xxx', implicit_returning=False)
        metadata = MetaData()
        tables = ['xxx', 'xxx', 'xxx']
        metadata.reflect(engine, only=tables)
        base = automap_base(metadata=metadata)
        base.prepare()
        session_maker = sessionmaker(bind=engine)
        session = session_maker()
由于数据库中有大量的表和列,因此加载会话需要相当长的时间,因为每次都必须进行反射

此外,我使用的IDE(PyCharm)在能够正确推断对象类型时提供了非常有用的自动完成功能。由于明显的原因,当我使用automap时,它不起作用。获取正确的列名字符串通常是一个挑战,需要我从db management studio反复验证它们


有没有一种使用反射生成声明性基类的方法?我至少可以用其他方式保存反射的元数据吗?可以安全地假设db模式不会更改。

您可以定义表示数据库中表的模型。考虑到数据库不会有太大的变化,这只需要做一次,以后可能会有一些列的变化

例如:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class SomeClass(Base):
    __tablename__ = 'some_table'
    id = Column(Integer, primary_key=True)
    name =  Column(String(50))

当然可以。我应该提到我是为了避免这样做,所以选择了反射路线。我不知道有哪些代码会从SQLAlchemy中的反射元数据生成上述Python代码。此外,即使可以以某种文本/二进制文件格式保存元数据,用Python代码编写也可能更易于维护。