【问题标题】:flask sqlalchemy query with keyword as function argument使用关键字作为函数参数的烧瓶 sqlalchemy 查询
【发布时间】:2019-07-24 13:03:28
【问题描述】:

我被函数中的查询卡住了。这是我的代码: 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() 这个错误是

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

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

deviceName = pins[changePin]['name']

我尝试了许多不同的方法,但都没有奏效,这里是第 4 行不同版本的列表:

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)

和许多其他变体,我已经阅读了 sqlalchemy 文档和烧瓶文档,但我没有看到任何比较,我已经查看并尝试了这个; flask sqlalchemy query with keyword as variable 但得到了这个;

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 这是我的 models.py 代码;

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)    

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

亲爱的门诺 谢谢你回复我,我听从了你的建议,它有效!!!

rows = Pins.query.filter_by(pin=changePin).all()
deviceName = rows[0].name

我不明白“rows[0].name”部分是如何工作的,但确实如此, 谢谢谢谢

帮助 问候 保罗

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

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

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

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

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

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

    调用返回一个包含零行或多行的列表,因此得名。 rows[0](第一行)就是你想要的。有了一行之后,一个字段就成为了该行的一个属性:rows[0].name。您还可以使用one() 来获取唯一 行。

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

    【讨论】:

    • 非常感谢您的回答!!我不明白你的回复,但我查看了“仅加载列”并将我的代码更改为 'deviceName = db.session.query(Pins).options(load_only("state")) '没有错误消息但这会打印“turned SELECT pins.id AS pins_id, pins.state AS pins_state FROM pins off”引脚更改状态,但我希望打印关联的名称。我不够了解,不知道如何在问题中表达自己!
    • 打印的是 SQLAlchemy 想要发送到数据库的查询。超级方便的调试,只是不是你想要的;=)。我将我的食谱应用于您的原始代码。希望这能让它更清楚。
    • 亲爱的 Menno,感谢您澄清您的第一个答案,正如您所见,我已将新代码发布到我的问题中并且它有效。我不明白 '.all() '调用查询,并且在第二部分 rows[0].name 适用于数据库中的所有行,而不仅仅是第一行。最后这是否意味着“rows = Pins.query.filter_by(pin=changePin).all()”的结果是一个字典?亲切的问候保罗
    • 来自 SQLAlchemy 文档:“将此查询表示的结果作为列表返回。”。所以不,不是字典,而是列表。
    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多