Ошибка SQLAlchemy при добавлении элемента в таблицу

avatar
Amir Gholami
9 августа 2021 в 05:45
46
1
0

Я пытаюсь выполнить следующую простую операцию для обновления записей таблицы SQL с помощью sqlite:

from sqlalchemy import create_engine
from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import update

engine = create_engine("sqlite:///tests.db", echo=True)

session = sessionmaker(bind=engine)()

Base = declarative_base()

class User(Base):
    __tablename__ = "usertable"
    username = Column(String, primary_key=True)
    password = Column(String)
Base.metadata.create_all(engine)

user = User()
user.username = "John"
user.password = "pass"
session.add(user)
session.commit()

stmt = update(User).where(User.c.password == 'pass').values(password='PASSWORD')
session.execute(stmt)
session.commit()

Но когда я запускаю это, я получаю следующую ошибку:

AttributeError: объект "Пользователь" не имеет атрибута "c"

Может ли кто-нибудь объяснить, как правильно это сделать?

Источник
Harsh Saini
9 августа 2021 в 05:48
1

По какой-то конкретной причине вы использовали User.c?

Amir Gholami
9 августа 2021 в 05:49
0

Я пытался следовать руководству здесь: docs.sqlalchemy.org/en/14/tutorial/…

Amir Gholami
9 августа 2021 в 05:50
0

@HarshSaini Если я не добавлю .c, а затем не распечатаю содержимое, пароль не будет обновлен.

Harsh Saini
9 августа 2021 в 05:56
0

Добавьте session.flush() после добавления пользовательских данных.

Amir Gholami
9 августа 2021 в 06:00
0

Я также пробовал, но он все еще не обновляет БД

Harsh Saini
9 августа 2021 в 06:11
0

Добавить session.flush() после session.add(), а не после обновления.

Amir Gholami
9 августа 2021 в 06:14
1

Я только что попробовал это тоже, и это не работает. Также обратите внимание, что session.commit() всегда вызывает session.flush(), поэтому добавление еще одного заранее не будет иметь значения.

snakecharmerb
9 августа 2021 в 07:23
1

Ссылка, которую вы разместили, предназначена для SQLAlchemy core, но вы используете ORM. Код работает, если вы удалите .c. Соответствующие учебные документы находятся здесь.

Amir Gholami
9 августа 2021 в 20:14
0

@snakecharmerb большое спасибо, это была проблема

Ответы (1)

avatar
Amir Gholami
9 августа 2021 в 20:15
0

Как уже упоминалось, для версии ORM не требуется расширение .c, и добавление session.execute в оператор обновления решит проблему:

stmt = update(User).where(User.password == 'pass').values(password='PASSWORD')
session.execute(stmt)
session.commit()