带关键字作为函数参数的flask sqlalchemy查询

时间:2019-03-02 20:08:31

标签: python sqlalchemy

我陷入了函数查询中。这是我的代码:{{1} 错误是


    def action(changePin, action):
        pins = Pins.query.all()
        changePin = int(changePin)
        deviceName = Pins.query.filter_by(pin=changePin, name)
        if action == "on":
            GPIO.output(changePin, GPIO.HIGH)
            print("turned ", deviceName , " on")
        if action =="off":
            GPIO.output(changePin, GPIO.LOW)
            print("turned ", deviceName , " off")
        for pin in pins:
            db.session.commit()

在第4行中,我想找到与引脚“ changePin”相关的引脚名称,这是本教程的改编代码,这是原始代码,其中词典保存了引脚信息而不是数据库,代码: / p>

 File "<stdin>", line 4
SyntaxError: positional argument follows keyword argument

我尝试了许多不同的方法,但是没有用,下面是第4行的不同版本的列表:

deviceName = pins[changePin]['name']

和许多其他变体,我已经阅读了sqlalchemy文档和flask文档,但是我没有看到任何比较,而是研究并尝试了这些方法。 flask sqlalchemy query with keyword as variable 但是得到了这个

deviceName = Pins.query.filter_by(changePin=pin).name deviceName = Pins.query.filter_by(changePin, name=name) deviceName = Pins.query.filter_by(Pins.pin=changePin, Pins.Name) deviceName = Pins.query(Pins.pin=changePin, Pins.Name) deviceName = Pins.query(**changePin, Pins.name) deviceName = Pins.query(**changePin) deviceName = db.session.filter_by(Pins.changePin) deviceName = db.session(Pins).filter_by(pin=changePin) 这是我的models.py代码;

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in action
TypeError: BaseQuery object argument after ** must be a mapping, not int

Querying with function on Flask-SQLAlchemy model gives BaseQuery object is not callable error

亲爱的门诺 谢谢您回到我身边,我已经按照您的建议进行了!!!

class Pins(db.Model):
id = db.Column(db.Integer, primary_key=True)
pin = db.Column(db.Integer, index=True, unique=True)
name = db.Column(db.String(64))
upDown = db.Column(db.String(4))
state = db.Column(db.String(9))

def __repr__(self):
    return '<Valves {}>'.format(self.pin)    

我不了解“ rows [0] .name”部分的工作原理,但确实如此, 谢谢谢谢

帮助 问候 保罗

1 个答案:

答案 0 :(得分:0)

filter_by表达式选择,而不是字段。来自documentation:“使用关键字表达式将给定的过滤条件应用于此查询的副本”。 Name不是关键字表达式,只是名称。

此外,在构建查询之后,您必须运行它。您可以通过在其上调用all()来做到这一点:

  

deviceName = Pins.query.filter_by(pin = changePin).all()

让我们也更改结果的名称:

  

行= Pins.query.filter_by(pin = changePin).all()

该调用返回具有零个或更多行的列表,因此返回名称。 rows[0](第一行)就是您想要的。在拥有一行之后,一个字段将成为该行的属性:rows[0].name。您还可以使用one()来获得 unique 行。

如果您仍然需要:要限制返回的列,请使用load only cols