2015-04-28 53 views
0

我在SQL查询方面完全缺乏知识,现在正困扰着我。Flask-SQLAlchemy - 如何将值附加到列?

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

我试过db.session.merge(用户)和db.session.add(用户),但最终都替换了列中的值。

更确切地说,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) 

回答

2

你的模型定义不是你真正想要的。 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() 

看SQLAlchemy的文档约relationships

+0

非常感谢。你把我放在正确的轨道上。我配置了多对多的关系,并使用.append就像你所描述的那样,现在它工作起来非常棒!(因为我使用的是flask-sqlalchemy,所以我不得不修改代码,但现在我知道在哪些部分doc看看!) 另一张桌子是创建的,持有classe.id和user.id,我现在可以查询谁去哪个班级等。2竖起大拇指! – Kinwolf

+0

不客气。看来,这个问题不是特定于SQLAlchemy或瓶子。它指的是常见的关系数据库理论。 –