【问题标题】:SQLAlchemy, Generating python declarative_base classes using reflection AND/OR Persisting reflected metadata and automap_baseSQLAlchemy,使用反射和/或持久化反射元数据和 automap_base 生成 python declarative_base 类
【发布时间】:2015-05-12 22:27:04
【问题描述】:

我使用 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) 可以正确推断对象类型时,它为我提供了非常有用的自动完成功能。由于显而易见的原因,当我使用自动映射时它不起作用。获得正确的列名字符串通常是一个挑战,并且需要我从 db management studio 反复验证它们。

有没有办法使用反射生成声明性基类?我至少可以以其他方式保留反映的元数据吗?可以安全地假设 db 架构不会改变。

【问题讨论】:

    标签: sqlalchemy


    【解决方案1】:

    您可以定义表示数据库中表的模型。鉴于预计数据库不会发生太大变化,这只需要完成一次,以后可能会更改一些列。

    例子:

    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))
    

    Documentation

    【讨论】:

    • 是的,当然。我应该提到我想避免这样做,因此走的是反思路线。
    • 我不知道会从 SQLAlchemy 中的反射元数据生成上述 Python 代码的代码。此外,即使可以以某种文本/二进制文件格式保存元数据,用 Python 代码编写它可能更易于维护。
    • 我最初使用SQLACodeGen 获取模型,然后清理它们。
    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 2012-05-22
    • 2013-04-27
    • 2011-03-08
    • 2020-12-29
    • 2013-02-24
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多