如何将class_name传递给要在Sqlalchemy查询中使用的函数

时间:2018-11-10 09:13:14

标签: python sqlalchemy

我正在尝试构建一个内部带有SQLAlchemy查询的User-class函数,该函数使我可以计算不同表上的User-record(基于其id)。为了避免使用多种函数编码,我尝试定义一个通用函数,在该函数中,我从Jinja2调用中接收db.modell类作为参数,例如:

{{ current_user.count('Customer') }}

{{ current_user.count('Player') }}

但是我最终遇到错误,因为Python无法将给定的class_name参数解释为真实的Class。他抱怨class_name没有功能ID。 当然,我可以为每个类指定特定的用户函数和特定的查询,但是我试图避免这些重复的编码。

关于如何处理此问题的任何想法?

class User(db.Model): 
  __tablename__='user'
  id = Column(Integer, primary_key=True)


  def count(self, class_name): 
        s = db.session()
        count = s.query(class_name).filter(class_name.id == self.id).count()
        return count

class Player(db.Model):
   __tablename__='player'
   id = Column(Integer, primary_key=True)

class Customer(db.Model):
   __tablename__='Customer'
   id = Column(Integer, primary_key=True)

预先感谢

迈克尔

1 个答案:

答案 0 :(得分:1)

最好将类本身传递给这样的函数:

 def count(self, class_): 
    s = db.session()
    count = s.query(class_).filter(class_.id == self.id).count()
    return count

但是如果由于某种原因必须传递类名,则可以执行以下操作:

 def count(self, class_name):
    class_ = {
        'player':Player,
        'customer':Customer,
    }[class_name.lower()]

    s = db.session()
    count = s.query(class_).filter(class_.id == self.id).count()
    return count

没有太大区别,但是您可以这样做。

还有另一种方法,但是我不建议这样做:

 def count(self, class_name):
    class_ = globals()[class_name]

    s = db.session()
    count = s.query(class_).filter(class_.id == self.id).count()
    return count

如果一切都存在于global范围内,这种方法将起作用。 了解有关globals Here

的信息

请注意:

  
      
  1. 注意不要将class用作变量的名称,class是预定义的。使用其他类似class_

  2.   
  3. 如果以第二种方式传递了错误的类名,它将引发key error。您可以使用tryexcept来处理它。

  4.