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() 只能用于单个映射类。”每当您尝试插入一个变量来代替类名时。 所以你传递了一些奇怪的东西,但是仅仅根据错误消息没有办法帮助你。类名到类的简单映射不会导致这种情况。 这个字典可以用oneliner classes = dict(inspect.getmembers(sys.modules[__name__], inspect.isclass))创建。请务必在定义类之后定义它,并确保同时导入inspectsys【参考方案2】:

db_model = request.values.get("db_model_class") item_id = request.values.get("item_id")

也许问题就在这里。 你需要设置一个调试点。

Ilja Everilä 的回答很棒。所以你需要检查你获取参数的方式。

如果您使用的是 pycharm,请配置调试设置。

如果您使用的是 Macbook, 点击运行->编辑配置->

然后您单击代码的左边距,然后使用右上角的调试按钮重新启动您的应用程序。当您再次请求该 url 时,您将看到您的视图函数在请求对象中获得了什么。

【讨论】:

以上是关于SQLAlchemy 查询 - 动态类选择的主要内容,如果未能解决你的问题,请参考以下文章

Python 学习笔记 - sqlAlchemy(初稿)

SqlAlchemy:动态查询

flask mysql sqlalchemy教程

sqlalchemy 动态查询条件怎么写

Python 学习笔记 - SQLAlchemy(下)

是否有使用 Sqlalchemy 的 Flask 动态查询构建器?