導入Flask
和SQLAlchemy
模塊第一:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
聲明app
和db
對象:
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///inquestion.db'
db = SQLAlchemy(app)
有三個表: Artist
,Album
和Genre
。所述Artist
對象可以鏈接到多個Albums
。而Album
對象可以鏈接到多個Artists
。該albums_to_artists_table
是保持Artists
和Albums
緊之間的關係:
albums_to_artists_table = db.Table('albums_to_artists_table',
db.Column('album_id', db.Integer, db.ForeignKey('album.id')),
db.Column('artist_id', db.Integer, db.ForeignKey('artist.id')))
class Genre(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
class Album(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
genre_id = db.Column(db.Integer, db.ForeignKey('genre.id'))
artists = db.relationship('Artist', backref='albums', lazy='dynamic', secondary=albums_to_artists_table)
class Artist(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
_albums = db.relationship('Album', secondary=albums_to_artists_table, backref=db.backref('albums_to_artists_table_backref', lazy='dynamic'))
所以我們有一個鏈接到鏈接到Genre
的Album
的Artist
,它看起來像這樣:Artist
>Album
>Genre
。
有了這個設置在地方,我們繼續前進,首先創建Genre
對象:
db.drop_all()
db.create_all()
genre = Genre(name='Heavy Metal')
db.session.add(genre)
db.session.commit()
然後兩張專輯:
album1 = Album(name='Ride the Lightning', genre_id = genre.id)
album2 = Album(name='Master of Puppets ', genre_id = genre.id)
db.session.add(album1)
db.session.add(album2)
db.session.commit()
和藝術家:
artist = Artist(name='Metallica', _albums=[album1, album2])
db.session.add(artist)
db.session.commit()
後,創建數據庫我們可以查詢什麼Albums
鏈接到Genre
:
print Album.query.filter_by(genre_id=1).all()
什麼Artists
鏈接到Album
:
print Artist.query.filter(Artist._albums.any(id=album1.id)).all()
現在我想查詢所有鏈接到一個Genre
經過genre.id的Artists
。如何實現它?
嗯,你們的關係沒有按「T似乎我的權利....您當前的關係一張專輯只能有一個流派,這意味着對於一個藝術家鏈接到X流派他必須有x張專輯......也就是你想要的嗎? – danidee
是的,這是故意的專輯和流派有一對一的關係。 – alphanumeric