Транзакция Sqlalchemy работает не так, как ожидалось

#python #flask #transactions #flask-sqlalchemy

Вопрос:

Я читал о транзакции sqlalchemy, которая transactions automatically determine which objects are to be saved first when objects have relations

Но когда я попытался

 >> user = User('demo user')
>> post = Post('Sample post')
>> post.user_id = user.id
>> db.session.add_all([post, user])
>> db.session.commit()
 

Он создает новую запись, с user_id = None которой не ожидается.

Ниже приведены мои реализации модели

 class User(db.Model):

    __tablename__ = 'users'

    id = db.Column(db.Integer(), primary_key=True)
    username = db.Column(db.String(40),nullable=False, unique=True, index=True)
    posts = db.relationship(
        'Post',
        backref='user',
        lazy='dynamic'
    )

    def __init__(self, username):
        self.username = username

    def __repr__(self):
        return f'<User {self.username}>'



class Post(db.Model):

    __tablename__ = 'posts'

    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(50), index=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id'))
    date = db.Column(db.DateTime(), default=datetime.datetime.now)

    def __init__(self, title):
        self.title = title

    def __repr__(self):
        return f'<Post {self.title}>'
 

может кто-нибудь, пожалуйста, объяснить, почему транзакция не сохраняет значение user_id?

Ответ №1:

Проблема, с которой вы столкнулись, id заключается в том, что она создается базой данных после фиксации. Так что на момент назначения ( post.user_id=user.id ) user.id есть None .

Если вы добавляете post posts «кому» в user объект, SQLAlchemy обрабатывает добавление правильного id .

 user = User('demo user')
post = Post('Sample post')
user.posts.append(post)
db.session.add(user)
db.session.commit()