我陷入了函数查询中。这是我的代码:{{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”部分的工作原理,但确实如此, 谢谢谢谢
帮助 问候 保罗
答案 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