【问题标题】:SQLAlchemy with_entities with dynamic inputs带有动态输入的 SQLAlchemy with_entities
【发布时间】:2020-05-13 03:12:42
【问题描述】:

如何为with_entities 选项提供动态输入?

目前我必须这样做:

columns = [DataModel.col1, DataModel.col2, ...]
data = DataModel.query.order_by(DataModel.id.desc()).with_entities(*columns).first()

但是,如果我将 col 名称设为 query-string parameters 并且必须动态定义它,我该怎么办?

编辑编辑编辑 以这种方式解决了它: 在我的模型中,我定义了类方法:

@classmethod
def find_by_filter(cls, attr):
    search_columns = [getattr(cls, i) for i in attr]

    return cls.query.order_by(cls.id.desc()).with_entities(*search_columns).first()

然后我可以通过这种方式从我的 Rest API 调用它:

liste = ["column 1", "column2", "column3", "column4"]

data = DataModel.find_by_filter(liste)

【问题讨论】:

标签: python sqlalchemy flask-sqlalchemy


【解决方案1】:

我遇到了同样的挑战,这就是我解决它的方法。 columns 只是一个 CSV 字符串,例如 "field1,field2,field3" 可以进一步压缩,但这足以提高可读性。

def pick_Columns(modelClass, columns):
  if len(columns) == 0:
    return None

  colArray = columns.split(',')
  modelObjects = [eval(f'{modelClass.__name__}.{col}') for col in colArray]
  return modelObjects


def Get_Data(**kwargs):
  retVal = kwargs['db'].query(m_DataModel)

  if kwargs.get('columns', None) is not None:
    colObj = pick_Columns(m_DataModel, kwargs['columns'])
    retVal = retVal.with_entities(*colObj)
    retVal = [row._asdict() for row in retVal.all()] # with_entities returns a tuple instead of dict. Remove this line if that's what you want

  else:
    retVal = retVal.all()

  return retVal

【讨论】:

    猜你喜欢
    • 2018-04-21
    • 2016-12-01
    • 2014-12-23
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2021-11-07
    相关资源
    最近更新 更多