【问题标题】:Adding data to related table with SQLAlchemy使用 SQLAlchemy 将数据添加到相关表
【发布时间】:2012-03-06 00:46:38
【问题描述】:

我对 SQLAlchemy(使用 Flask SqlAlchemy)对象定义了这个:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True)
    password = db.Column(db.String(30))
    email = db.Column(db.String(45), unique=True)
    friends = db.relationship('Friend', backref='user',
                                lazy='dynamic')

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

    def __repr__(self):
        return "<User('%s','%s','%s')>" % (self.username, self.email, self.id)


class Friend(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    userId = db.Column(db.Integer, db.ForeignKey('user.id'))
    friendId = db.Column(db.Integer)
    created = db.Column(db.DateTime)

    def __init__(self, userId, friendId):
        self.userId = userId
        self.friendId = friendId
        self.created = datetime.datetime.now()

    def __repr__(self):
        return "<Friend(%i,%i)>" % (self.userId, self.friendId)

据我所知,要添加一个朋友,我应该可以这样做:

首先获取用户:

MyUser = bpdata.User.query.filter_by(id=1).first()

结交朋友:

MyFriend = bpdata.User.query.filter_by(id=2).first()

现在我想做:

MyUser.Friends.Append(MyFriend)

这可能吗,还是我只需将朋友 ID 直接添加到表 Friend 中?

【问题讨论】:

  • 我认为您正在创建错误的关系。一个用户有很多朋友,同一个朋友可以成为多个用户的朋友,所以你必须使用 M2M 而不是 O2M。

标签: python sqlalchemy


【解决方案1】:

这是我自己想出来的..

我需要做的是:

MyUser.friends.append(Friend(MyUser.id, MyFriend.id))

然后提交更新。

更新:

好的,我找到了做我想做的事情的正确方法。首先,我根本不需要 Friend 表/类。完整代码:

association_table = db.Table('association',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('friend_id', db.Integer, db.ForeignKey('user.id'))
)
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True)
    password = db.Column(db.String(30))
    email = db.Column(db.String(45), unique=True)
    friends = db.relationship("User",
                secondary=association_table,
                backref='added_by',
                primaryjoin=id == association_table.c.user_id,
                secondaryjoin=id == association_table.c.friend_id)

有了这个我现在可以做以下事情:

>>> user1 = User.query.filter_by(id=1).first()
>>> user1.friends
[]
>>> user2 = User.query.filter_by(id=2).first()
>>> user1.friends.append(user2)
>>> user1.friends
[<User('user1','user1@admin.com','2')>]
>>> user1.friends[0].added_by
[<User('admin','admin@admin.com','1')>]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 2021-07-24
    • 2019-02-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多