python - flask sqlalchemy 将数据库名称作为字符串传递
问题描述
我正在开发一个通过sqlalchemy与 SQL 通信的烧瓶应用程序
我有一个简单的问题,我在网上找不到答案,我怎样才能将 a 传递database_name
给str()
请求。例如:
row_id = 1
### normal call
row = User.query.filter_by(id = row_id).first_or_404()
### what I'd like to achieve
database_name = User
row = database_name.query.filter_by(id = row_id).first_or_404()
我当然得到
AttributeError:“str”对象没有属性“query”
但我想知道是否有安全的方法来实现这一目标。
非常感谢您的帮助!
解决方案
您在上面的代码段中提供的代码应该可以工作,但听起来您想要的是能够从字符串中解析User
模型。'User'
sqlalchemy 没有任何东西可以实现这一点;该query
方法需要实际的模型类。
但是,这并不意味着不可能。我的团队通过将模型名称注册到注册表中的类来解决类似的问题。这是一个非常简单的版本。在生产代码中,您可能需要更加小心地确保 model_name_registry 是类的单例实例,并且您没有重复注册任何模型名称等。
model_name_registry = {}
# Create a decorator to automatically register model names to the class
def register_class_name(cls_):
model_name_registry[cls_.__name__] = cls_
def inner(*args, **kwargs):
return cls_(*args, **kwargs)
return inner
# Decorate the classes you want to refer to by string
@register_class_name
class MyModel(Base):
__tablename__ = 'my_table_name'
# . . .
然后,你可以这样做:
model = model_name_registry['User']
model.query(...)
推荐阅读
- angular - 如何为反应式表单控件编写自定义验证器
- python - 使用 Python 进行 Linux 包管理
- javascript - 用函数中的数组替换现有数组
- eclipse - 如何在现有项目的 Eclipse 中从 GitLab 中拉出新分支
- r - 将 brew 安装的 openblas 链接到 /usr/local
- java - 在spring应用程序中使用hibernate自动创建表
- go - Go 模块替换为本地模块的特定版本
- javascript - 将列表从视图上下文传递到模板并将其分配为模板中的数组
- python-3.x - Python - 线程占用过多的 CPU
- keras - 在给定非文本序列数据的情况下,用于多类分类的 LSTM 的 y-train 的形状应该是什么?