【问题标题】:Flask-SQLAlchemy - How to append a value to a column?Flask-SQLAlchemy - 如何将值附加到列?
【发布时间】:2015-04-28 02:52:15
【问题描述】:

我在 SQL 查询方面完全缺乏知识,现在让我很难受。

在flask-Sqlalchemy 中,如何将一个值附加到已有的列而不替换已经存在的列?

我尝试了 db.session.merge(user) 和 db.session.add(user) 但最终都替换了列中的值。

更准确地说,Users 表有一个名为 classes_id 的列,用于记录他参加的体育课的“id”字段。因此,随着时间的推移,该字段需要使用许多其他类“id”进行更新。

以防万一,这里是模型

class Classes(db.Model):
    __tablename__= 'classes'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    date = db.Column(db.DateTime)
    participants =  db.relationship('User', backref='classes', lazy='dynamic')
    status = db.Column(db.Integer)  #1 = open, 0 = closed

class User(UserMixin,db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    email = db.Column(db.String(64),unique=True,index=True)
    firstname = db.Column(db.String(64))
    lastname = db.Column(db.String(64))
    fullname = db.Column(db.String(64))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    password_hash = db.Column(db.String(128))
    member_since = db.Column(db.DateTime(), default=datetime.utcnow)
    last_seen = db.Column(db.DateTime(), default=datetime.utcnow)
    notes = db.Column(db.Text())
    classes_id = db.Column(db.Integer, db.ForeignKey("classes.id"))

还有views.py

@main.route('/add_attendees/<int:class_id>',methods=['GET','POST'])
@login_required
def add_attendees(class_id):
    form = Find_member()
    if form.validate_on_submit():
        fullname = form.member_name.data
        find_username = fullname.find('-')
        username = fullname[find_username + 2:]
        user = User.query.filter_by(username=username).first()
        user.classes_id = class_id          
        db.session.merge(user)
        db.session.commit()
    return redirect(url_for('.add_attendees',class_id = class_id))
return render_template('members_list.html',form=form)

【问题讨论】:

    标签: python-3.x flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您的模型定义不是您真正想要的。 User.classes_id 只定义了一个值。正确答案取决于要求。必须存在什么样的关系?许多User 到许多Classes (M:M)?在这种情况下,您将创建如下模型:

    user_to_classes = Table('user_to_classes', Base.metadata,
        Column('class_id', Integer, ForeignKey('class.id')),
        Column('user_id', Integer, ForeignKey('user.id'))
    )
    
    class Class(Base):
        ...
        # your old wrong code
        # participants = ...
        # here is right definition
        participants = relationship(
            'User', secondary=user_to_classes, backref='classes')
    
    # In the User class you should not write any foreign keys and relations.
    # There will be `classes` field defined in backref of `Class.participants
    

    您可以通过以下方式将用户添加到班级:

    user = ...# some code that creates or selects a user
    class_ = ...# some code that creates or selects a class
    # here is the addition
    class_.participants.append(user)
    session.commit()
    

    查看有关 relationships 的 Sqlalchemy 文档。

    【讨论】:

    • 非常感谢。你让我走上了正确的轨道。我配置了多对多关系并使用了 .append 就像你描述的那样,它现在工作得很好!(由于我使用的是flask-sqlalchemy,所以我不得不稍微修改一下代码,但现在我知道了要查看的文档!)创建了另一个包含 classe.id 和 user.id 的表,我现在可以查询谁去了哪个班级,等等。2 大拇指!
    • 不客气。看来,问题并不特定于 SQLAlchemy 或烧瓶。它指的是常见的关系数据库理论。
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多