首页 > 解决方案 > flask sqlalchemy 将数据库名称作为字符串传递

问题描述

我正在开发一个通过sqlalchemy与 SQL 通信的烧瓶应用程序

我有一个简单的问题,我在网上找不到答案,我怎样才能将 a 传递database_namestr()请求。例如:

    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”

但我想知道是否有安全的方法来实现这一目标。

非常感谢您的帮助!

标签: pythonflasksqlalchemy

解决方案


您在上面的代码段中提供的代码应该可以工作,但听起来您想要的是能够从字符串中解析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(...)

推荐阅读