SQLAlchemy 查询 - 动态类选择
Posted
技术标签:
【中文标题】SQLAlchemy 查询 - 动态类选择【英文标题】:SQLAlchemy Query - Dynamic class selection 【发布时间】:2018-07-06 20:10:46 【问题描述】:我可以找到许多关于如何在“filter_by”部分是动态的情况下构建这些查询的示例,但我似乎找不到类名是动态位的任何内容。我确定肯定有答案,只是不确定要搜索什么。
我的用例是这样的:我需要构建一个动态 SQLAlchemy 查询。不同之处在于它的类名发生了变化,而不是过滤器变量。查询类型将始终是“.get()”,所以我很好。我还应该说,简单地在类名应该是的地方插入一个变量是行不通的。
db_model = request.values.get("db_model_class")
item_id = request.values.get("item_id")
result = db.session.query(db_model).get(int(item_id))
我该如何进行这项工作?
【问题讨论】:
相关:***.com/questions/1373164/… 您可以像对待python中的任何其他变量一样对待db_model
,并将模型类引用传递给它,以形成IIjia回答的通用查询。
【参考方案1】:
创建相关类的查找:
models = "Foo": Foo,
"Bar": Bar,
"...": ...
并获取课程:
db_model = models[request.values.get("db_model_class")]
【讨论】:
不幸的是,这不起作用。您收到错误“sqlalchemy.exc.InvalidRequestError:get() 只能用于单个映射类。”每当您尝试插入一个变量来代替类名时。 所以你传递了一些奇怪的东西,但是仅仅根据错误消息没有办法帮助你。类名到类的简单映射不会导致这种情况。 这个字典可以用onelinerclasses = dict(inspect.getmembers(sys.modules[__name__], inspect.isclass))
创建。请务必在定义类之后定义它,并确保同时导入inspect
和sys
。【参考方案2】:
db_model = request.values.get("db_model_class") item_id = request.values.get("item_id")
也许问题就在这里。 你需要设置一个调试点。
Ilja Everilä 的回答很棒。所以你需要检查你获取参数的方式。
如果您使用的是 pycharm,请配置调试设置。
如果您使用的是 Macbook, 点击运行->编辑配置->
然后您单击代码的左边距,然后使用右上角的调试按钮重新启动您的应用程序。当您再次请求该 url 时,您将看到您的视图函数在请求对象中获得了什么。
【讨论】:
以上是关于SQLAlchemy 查询 - 动态类选择的主要内容,如果未能解决你的问题,请参考以下文章