gpt4 book ai didi

python-3.x - 如何使用字符串变量作为表名进行 sqlalchemy 查询?

转载 作者:行者123 更新时间:2023-12-03 18:02:58 28 4
gpt4 key购买 nike

如果我不清楚,我提前道歉,英语不是我的母语。
如果我犯了太多错误,请随时告诉我:)

我是使用flask_sqlalchemy的新手,在互联网上花费数小时寻找答案后感到沮丧。

我想要做的是这样的查询:

ModelName.query.filter_by(name='something').all()

但不是使用 ModelName 我想做这样的事情:
model_list = ['Model1', 'Model2', 'Model3']
for model in model_list:
some_var = model.query.filter_by(name='something').all()
# do some stuff with the variable

错误是:
'str' object has no attribute 'query'

在尝试将 db.session.add() 与字符串变量一起使用时,我当然遇到了同样的问题。

我知道查询需要某种_BoundDeclarativeMeta对象而不是字符串,但是如何从列表中获取该对象以将其传递给for循环?

我尝试使用 'db.metadata.tables[my_variable]' 但我得到了一个 Table 对象而不是一个 _BoundDeclarativeMeta 对象,它的工作方式不一样。

我设法使用
db.session.query(db.metadata.tables[my_variable])

代替
my_variable.query

但我不能将这种方法用于“db.session.add()”(或者有可能吗?)

有什么方法可以将字符串变量“转换”为正确类型的 sqlalchemy 对象?

最佳答案

我需要一种通过引用模型的表名来查询的方法。这是我想出的:

class Model1(db.Model):
__tablename__ = 'table1' # or whatever, doesn't matter

class Model2(db.Model):
__tablename__ = 'table2'

tables_dict = {table.__tablename__: table for table in db.Model.__subclasses__()}

def table_object(table_name):
return tables_dict.get(table_name)

然后,像这样使用它:
model_list = ['table1', 'table2']
for model in model_list:
some_var = db.session.query(table_object(table_name=model)).filter_by(name='something').all()

重要的一点是 db.Model.__subclasses__() - 给出了模型类(对象?)的列表。

关于python-3.x - 如何使用字符串变量作为表名进行 sqlalchemy 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41176006/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com