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