我有一个SQLAlchemy
拥有的Postgres
数据库:
轨道模型:
class Track(db.Model):
__tablename__='track'
"""
Model for storing track information
"""
id = db.Column(db.Integer, primary_key=True)
created = db.Column(db.DateTime, default=func.now())
popularity = db.Column(db.Integer)
playing = db.Column(db.Boolean, default=False)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
def __init__(self, title, artist, uri):
self.title = title
self.artist = artist
self.uri = uri
def serialize(self):
return {
'id' : self.id,
'title': self.title,
'created': self.created,
'popularity': self.popularity,
'playing': self.playing,
}
播放列表模型:
class Playlist(db.Model):
"""
Model for storing playlist information belonging to a specific user
"""
__tablename__ = 'playlist'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(50))
created = db.Column(db.DateTime, default=func.now())
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
tracks = db.relationship('Track',
secondary=playlist_tracks,
backref=db.backref('playlists',
lazy='dynamic'))
def __init__(self, title, user):
self.title = title
self.user = user
def serialize(self):
"""Return object data in easily serializeable format"""
return {
'id' : self.id,
'created' : self.created,
'title': self.title,
'tracks': [item.serialize() for item in self.tracks]
}
我还有这个辅助表:
playlist_tracks = db.Table('playlist_tracks',
db.Column('track_id', db.Integer, db.ForeignKey('track.id')),
db.Column('playlist_id', db.Integer, db.ForeignKey('playlist.id')))
在创建playlist
对象并将tracks
添加到对象之后,如下所示:
playlist.tracks.append(track)
print ('PLAY SERIALIZE',playlist.serialize())
如任务日志所示,将 tracks
添加到playlist
:
[2019-05-02 05:30:26,093: WARNING/ForkPoolWorker-5] PLAY SERIALIZE
[2019-05-02 05:30:26,097: WARNING/ForkPoolWorker-5] {'id': 1, 'created': datetime.datetime(2019, 5, 2, 5, 30, 25, 678181), 'title': 'Cache', 'artist': None, 'tracks': [{'id': 1, 'title': 'Time', 'artist': 'Pink Floyd', 'created': datetime.datetime(2019, 5, 2, 5, 30, 25, 897034)
然后,我移到Postgres
,它在我的服务容器中拥有SQLAlchemy
数据库:
$ docker-compose -f docker-compose-dev.yml exec web-db psql -U postgres
$ \c web_dev
如果我是
select * from tracks;
查询有效,并向我显示所有曲目。如果我:
select * from playlist_tracks;
它也可以工作:
track_id | playlist_id
----------+-------------
1 | 1
2 | 1
3 | 1
如何像tracks
一样从Postgres上的playlist
对象获取并返回所有序列化的playlist.serialize()
?