我处于我想要访问的数据使用 SQL Server 中的表值函数的情况。
我正在构建的应用程序已经使用 SQLAlchemy ORM 和declarative_base()
. 然后使用解析这些marshmallow_sqlalchemy.SQLAlchemyAutoSchema
当我尝试如下定义一个类时,我得到一个错误,表的 PK 无法映射,并且存储的列集合.c
是一个空列表。
具体来说,错误是KeyError: 'PrimaryKey'
注释掉__mapper_args__
结果:
sqlalchemy.exc.ArgumentError: Mapper mapped class TestModel->anon_1 could not assemble any primary key columns for mapped table 'anon_1'
import sqlalchemy
from sqlalchemy import create_engine, MetaData, func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
engine = create_engine("MY_CONN_STR")
# Create a locally scoped session object to be used for queries
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
db_session = scoped_session(SessionLocal)
class _Base:
"""
Class defined to modify sqlalchemy declarative_base()
"""
query = db_session.query_property()
Base = declarative_base(cls=_Base)
class TestModel(Base):
"""
A Dynamic SQLAlchemy DB Model to use with a TVF
"""
__table__ = func.mySchema.MyFuncWith2Defaults(None, None).table_valued()
__table_args__ = {"schema": "mySchema"}
__mapper_args__ = {"primary_key": func.mySchema.MyFuncWith2Defaults(None, None).table_valued().c["PrimaryKey"]}
@classmethod
def return_all_rows(cls) -> List["TestModel"]:
return cls.query.all()
理想情况下,我想要达到的目的是将特定的 tvf 函数名称传递给函数,并让该函数为我创建类,如下所示:
def get_function_model(func_name: str, schema: str, pk: str=None) -> "TestModel":
"""
Returns a SQLAlchemy DB Model of the supplied function name
"""
# I'm aware the below will not work, but this is how I could do it with a normal Table I think
attr_dict = {"__table__": metadata.tables[f"{schema}.{func_name}"]}
if pk is not None:
attr_dict["__mapper_args__"] = {"primary_key": attr_dict["__table__"].c[pk]}
return type("TestModel", (TestModel,), attr_dict)
我可以使用 查询 TVF 精细engine.execute()
,并在这样做时列标题按预期在行对象上拉出。
我的问题是,如何将 TVF 映射到 SQLAlchemy 类