2015-04-28 52 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或瓶子。它指的是常見的關係數據庫理論。 –