用烧瓶提交一次写入三个数据库
Writing into three databases with one submit with flask
我一周前开始玩 Flask,已经遇到了一个小问题,我不知道 Flask 是否可以将它作为一个框架来处理,或者我是否需要以 "old" 的方式解决它。
情况是这样的。
我有三个数据库 Platten、Label 和 Artist。为了填写表格,我有一个表格,我可以在其中输入 LP 的信息(艺术家、标签、发行日期等)。
通过提交表格,我想检查艺术家数据库,如果艺术家是是否已经存在。如果exitend,取id保存给LP。如果艺术家不在数据库中,写入它并保存新的 id。
标签相同。
这是我的 models.py 文件:
从应用导入数据库
从 werkzeug.security 导入 generate_password_hash, check_password_hash
来自 flask_login 导入 UserMixin
从应用导入 login_manager
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
def __repr__(self):
return '<User {}>'.format(self.username)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Label(db.Model):
__tablename__ = 'labels'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Label {}>'.format(self.name)
class Artist(db.Model):
__tablename__ = 'artists'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Artist {}>'.format(self.name)
class Platte(db.Model):
__tablename__ = 'platten'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64), index=True)
label_id = db.Column(db.Integer, db.ForeignKey('labels.id'))
label = db.relationship('Label', backref=db.backref('platten'), lazy=True)
release_date = db.Column(db.Date())
artist_id = db.Column(db.Integer, db.ForeignKey('artists.id'))
artist = db.relationship('Artist', backref=db.backref('platten'), lazy=True)
def __repr__(self):
return '<Platte {}>'.format(self.title)
这是我的 routes.py 文件:
from flask import render_template, flash, redirect, url_for, request
from app import app, db
from app.forms import LoginForm, RegistrationForm, PlattenForm
from flask_login import current_user, login_user, logout_user, login_required
from app.models import User, Platte, Artist, Label
from werkzeug.urls import url_parse
@app.route('/')
@app.route('/index')
@login_required
def index():
platten = Platte.query.all()
return render_template('index.html', title='Home', platten=platten)
@app.route('/add', methods=['GET', 'POST'])
@login_required
def platten_add():
form = PlattenForm()
if form.validate_on_submit():
artist = Artist(name=form.artist.data)
label = Label(name=form.label.data)
# artist_check = Artist.query.filter_by(name=artist).first()
# if artist_check is None:
# db.session.add(artist)
# db.session.commit()
# artist_id = Artist.query.filter_by(name=artist).first()
# artist_id = artist_id.id
# else:
# artist_id = artist_check.id
platte = Platte(title=form.title.data, label_id=label.id, label=label, artist_id=artist.id, artist=artist, release_date=form.release_date.data)
db.session.add(platte)
db.session.commit()
flash('Platte ' + platte.title + ', hinzugefügt!')
return redirect(url_for('platten_add'))
return render_template('platten_add.html', title='Add', form=form)
routes.py 中的注释部分将是 "old" 时尚的方式,我将如何插入数据库。
有没有办法在 flask 中执行此操作,还是我必须像代码的注释部分那样手动执行此操作?
感谢您的帮助。
不,这在 flask_sqlalchemy
中是不可能的。为了访问像 artist.id
这样的对象 ID,它必须已经保存。
同样是一对多,这是首选的方式:
class Label(db.Model):
__tablename__ = 'labels'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
platten = db.relationship('Platte', backref='labels')
def __repr__(self):
return '<Label {}>'.format(self.name)
class Artist(db.Model):
__tablename__ = 'artists'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
platten = db.relationship('Platte', backref='artists')
def __repr__(self):
return '<Artist {}>'.format(self.name)
class Platte(db.Model):
__tablename__ = 'platten'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64), index=True)
label_id = db.Column(db.Integer, db.ForeignKey('labels.id'))
release_date = db.Column(db.Date())
artist_id = db.Column(db.Integer, db.ForeignKey('artists.id'))
def __repr__(self):
return '<Platte {}>'.format(self.title)
这反过来意味着您现在可以:
@app.route('/add', methods=['GET', 'POST'])
@login_required
def platten_add():
form = PlattenForm()
if form.validate_on_submit():
artist = Artist.query.filter_by(name=form.artist.data).first()
if not artist:
artist = Artist(name=form.artist.data)
db.session.add(artist)
label = Label.query.filter_by(name=form.label.data).first()
if not label:
label = Label(name=form.label.data)
db.session.add(label)
platte = Platte(title=form.title.data, release_date=form.release_date.data)
label.platten.append(platte)
artist.platten.append(platte)
db.session.commit()
flash('Platte ' + platte.title + ', hinzugefügt!')
return redirect(url_for('platten_add'))
return render_template('platten_add.html', title='Add', form=form)
我一周前开始玩 Flask,已经遇到了一个小问题,我不知道 Flask 是否可以将它作为一个框架来处理,或者我是否需要以 "old" 的方式解决它。
情况是这样的。
我有三个数据库 Platten、Label 和 Artist。为了填写表格,我有一个表格,我可以在其中输入 LP 的信息(艺术家、标签、发行日期等)。
通过提交表格,我想检查艺术家数据库,如果艺术家是是否已经存在。如果exitend,取id保存给LP。如果艺术家不在数据库中,写入它并保存新的 id。
标签相同。
这是我的 models.py 文件: 从应用导入数据库 从 werkzeug.security 导入 generate_password_hash, check_password_hash 来自 flask_login 导入 UserMixin 从应用导入 login_manager
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
def __repr__(self):
return '<User {}>'.format(self.username)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Label(db.Model):
__tablename__ = 'labels'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Label {}>'.format(self.name)
class Artist(db.Model):
__tablename__ = 'artists'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Artist {}>'.format(self.name)
class Platte(db.Model):
__tablename__ = 'platten'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64), index=True)
label_id = db.Column(db.Integer, db.ForeignKey('labels.id'))
label = db.relationship('Label', backref=db.backref('platten'), lazy=True)
release_date = db.Column(db.Date())
artist_id = db.Column(db.Integer, db.ForeignKey('artists.id'))
artist = db.relationship('Artist', backref=db.backref('platten'), lazy=True)
def __repr__(self):
return '<Platte {}>'.format(self.title)
这是我的 routes.py 文件:
from flask import render_template, flash, redirect, url_for, request
from app import app, db
from app.forms import LoginForm, RegistrationForm, PlattenForm
from flask_login import current_user, login_user, logout_user, login_required
from app.models import User, Platte, Artist, Label
from werkzeug.urls import url_parse
@app.route('/')
@app.route('/index')
@login_required
def index():
platten = Platte.query.all()
return render_template('index.html', title='Home', platten=platten)
@app.route('/add', methods=['GET', 'POST'])
@login_required
def platten_add():
form = PlattenForm()
if form.validate_on_submit():
artist = Artist(name=form.artist.data)
label = Label(name=form.label.data)
# artist_check = Artist.query.filter_by(name=artist).first()
# if artist_check is None:
# db.session.add(artist)
# db.session.commit()
# artist_id = Artist.query.filter_by(name=artist).first()
# artist_id = artist_id.id
# else:
# artist_id = artist_check.id
platte = Platte(title=form.title.data, label_id=label.id, label=label, artist_id=artist.id, artist=artist, release_date=form.release_date.data)
db.session.add(platte)
db.session.commit()
flash('Platte ' + platte.title + ', hinzugefügt!')
return redirect(url_for('platten_add'))
return render_template('platten_add.html', title='Add', form=form)
routes.py 中的注释部分将是 "old" 时尚的方式,我将如何插入数据库。
有没有办法在 flask 中执行此操作,还是我必须像代码的注释部分那样手动执行此操作? 感谢您的帮助。
不,这在 flask_sqlalchemy
中是不可能的。为了访问像 artist.id
这样的对象 ID,它必须已经保存。
同样是一对多,这是首选的方式:
class Label(db.Model):
__tablename__ = 'labels'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
platten = db.relationship('Platte', backref='labels')
def __repr__(self):
return '<Label {}>'.format(self.name)
class Artist(db.Model):
__tablename__ = 'artists'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
platten = db.relationship('Platte', backref='artists')
def __repr__(self):
return '<Artist {}>'.format(self.name)
class Platte(db.Model):
__tablename__ = 'platten'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64), index=True)
label_id = db.Column(db.Integer, db.ForeignKey('labels.id'))
release_date = db.Column(db.Date())
artist_id = db.Column(db.Integer, db.ForeignKey('artists.id'))
def __repr__(self):
return '<Platte {}>'.format(self.title)
这反过来意味着您现在可以:
@app.route('/add', methods=['GET', 'POST'])
@login_required
def platten_add():
form = PlattenForm()
if form.validate_on_submit():
artist = Artist.query.filter_by(name=form.artist.data).first()
if not artist:
artist = Artist(name=form.artist.data)
db.session.add(artist)
label = Label.query.filter_by(name=form.label.data).first()
if not label:
label = Label(name=form.label.data)
db.session.add(label)
platte = Platte(title=form.title.data, release_date=form.release_date.data)
label.platten.append(platte)
artist.platten.append(platte)
db.session.commit()
flash('Platte ' + platte.title + ', hinzugefügt!')
return redirect(url_for('platten_add'))
return render_template('platten_add.html', title='Add', form=form)