flask sqlalchemy pass Имя базы данных в виде строки - PullRequest
0 голосов
/ 29 апреля 2020

Я занимаюсь разработкой приложения flask, которое взаимодействует с SQL через sqlalchemy

У меня есть простой вопрос, на который я не нашел ответа, глядя в Интернете, как я могу передать 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'

, но я ' Хотелось бы узнать, есть ли безопасный способ добиться этого.

Заранее большое спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Код, который вы указали в приведенном выше фрагменте кода, должен работать, но похоже, что вы хотите иметь возможность разрешить модель User из строки 'User'.

Нет ничего запеченного в sqlalchemy для достижения этой цели; query метод требует фактического класса модели.

Однако это не означает, что это невозможно. Моя команда решает подобные проблемы, регистрируя название модели для класса в реестре. Вот очень упрощенная c версия этого. В производственном коде вы, возможно, захотите быть более внимательным, чтобы убедиться, что model_name_registry является одноэлементным экземпляром класса, и что вы не регистрируете дважды имена моделей, и т. Д. c.

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(...)
0 голосов
/ 29 апреля 2020

Этого можно добиться, используя встроенный exe c ()

Код:

database_name = «Пользователь»
row = exe c (database_name + «. query.filter_by (id = row_id ”). first_or_404 ())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...