запрос sqlalchemy о фляге с ключевым словом в качестве аргумента функции - PullRequest
0 голосов
/ 02 марта 2019

Я застрял с запросом в функции.Вот мой код: 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 и документы по колбам, но я не видел никаких сравнений, я смотрел и пробовал это; запрос sqlalchemy о фляге с ключевым словом в качестве переменной , но получил это;

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)    

Запрос с функцией наМодель Flask-SQLAlchemy дает объекту BaseQuery не вызываемую ошибку

Уважаемый Менно Спасибо, что обратились ко мне. Я последовал вашему совету, и это работает !!!

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

Iне понимаю, как работает часть "row [0] .name", но она работает, спасибо, спасибо

помогите с Полом

1 Ответ

0 голосов
/ 03 марта 2019

Выражение filter_by выбирает строки , а не поля.Из документации : «применить данный критерий фильтрации к копии этого запроса, используя выражения ключевых слов.».Name - это не выражение для ключевого слова, а просто имя.

Кроме того, после построения запроса его необходимо выполнить.Вы делаете это, вызывая all() на нем:

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

Позвольте также изменить имярезультата:

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

Вызов, который возвращает список с нулем или более строк, следовательноимя.rows[0] (первый ряд) - это то, что вы хотите.После того, как у вас есть строка, поле становится атрибутом строки: rows[0].name.Вы также можете использовать one(), чтобы получить уникальную строку.

Если вам все еще нужно: Чтобы ограничить возвращаемые столбцы, используйте загрузить только столбцы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...