Flaskベース-(データベース操作)
13821 ワード
1.mysqlデータベースの接続と構成
2.カスタムモデルクラス
3.テーブルの削除とテーブルの作成
4.データベースの基本操作
5.データベースの移行
開発中は、データベース・モデルを変更し、変更後にデータベースを更新する必要があります.最も直接的な方法は、古いテーブルを削除することですが、データが失われます.より良い解決策は、データベース・スキーマの変化を追跡し、変更をデータベースに適用するデータベース・移行フレームワークを使用することです.
参考:juejin.im/post/5cc7fb…
6.メール拡張
7.データベースモデル関係
a.一対一のモデルケース:一つの文章は一つの内容にしか対応していない
b.一対のマルチモデルケース:一つの分類の下に多くの文章がある
c.多対多モデルケース:一つのラベルは多くの文章に対応し、一つの文章も多くのラベルに対応する
d.自己関連モデルケース:地域
a. :
import pymysql
from flask_sqlalchemy import SQLAlchemy
b.
#
app = Flask(__name__)
# : /
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://Juliet:[email protected]/flask_books'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# secret_key
app.secret_key = 'dev'
#
pymysql.install_as_MySQLdb()
db = SQLAlchemy(app)
2.カスタムモデルクラス
class Author(db.Model):
''' '''
__tablename__ = 'authors'
#
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(16),unique=True)
#
# books (Author ) ,author Book
books = db.relationship('Book',backref='author')
def __repr__(self):
return 'Author:%s'% self.name
class Book(db.Model):
''' '''
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
author_id = db.Column(db.Integer,db.ForeignKey('authors.id'))
def __repr__(self):
return 'Book:%s'% self.name
3.テーブルの削除とテーブルの作成
db.drop_all()
db.create_all()
4.データベースの基本操作
a. Flask-SQLAlchemy , 、 、 , , db.session
b. , commit()
c. , , , ,
db.session.rollback() ,
d. Flask-SQLAlchemy , query 。 ,
5.データベースの移行
開発中は、データベース・モデルを変更し、変更後にデータベースを更新する必要があります.最も直接的な方法は、古いテーブルを削除することですが、データが失われます.より良い解決策は、データベース・スキーマの変化を追跡し、変更をデータベースに適用するデータベース・移行フレームワークを使用することです.
参考:juejin.im/post/5cc7fb…
: Flask-Script flask-migrate
:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
pymysql.install_as_MySQLdb()
app = Flask(__name__)
# flask
manager = Manager(app)
# URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]:3306/db_flask'
#
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
#
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# SQL
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
#
Migrate(app, db)
# db
manager.add_command('db', MigrateCommand)
#
class Type(db.Model):
#
__tablename__ = 'tbl_types'
#
id = db.Column(db.Integer, primary_key=True) #
name = db.Column(db.String(32), unique=True) #
# , 。
# backref:
heros = db.relationship("Hero", backref='type')
def __repr__(self):
return self.name
#
class Hero(db.Model):
#
__tablename__ = 'tbl_heros'
#
id = db.Column(db.Integer, primary_key=True) #
name = db.Column(db.String(64), unique=True) #
gender = db.Column(db.String(64)) #
#
type_id = db.Column(db.Integer, db.ForeignKey("tbl_types.id"))
def __repr__(self):
return self.name
if __name__ == '__main__':
# 0.0.0.0
# app.run(host='0.0.0.0', port=5000) #
manager.run()
migrations ,
python flask_migrate_db.py db init
Django makemigrations , 。 , 。 -m:
python flask_migrate_db.py db migrate -m 'first create'
, :
python flask_migrate_db.py db migrate -m 'add age'
, , upgrade :
python flask_migrate_db.py db upgrade
age 。
:
, , , , python flask_migrate_db.py db history , 。
:
python flask_migrate_db.py db downgrade base
:
python flask_migrate_db.py db downgrade 4cee71e47df3
6.メール拡張
from flask import Flask
from flask_mail import Mail,Message
app = Flask(__name__)
# : / / / /
app.config.update(
DEBUG = True,
MAIL_SERVER='smtp.qq.com',
MAIL_PROT=465,
MAIL_USE_TLS = True,
MAIL_USERNAME = '[email protected]',
MAIL_PASSWORD = 'mkdggikrxfxkbcee', # SMTP
)
mail = Mail(app)
@app.route('/')
def index():
# sender ,recipients
msg = Message("This is a test message!",sender="[email protected]",recipients=['[email protected]','[email protected]'])
#
msg.body = "Flask Test Mail"
mail.send(msg)
print("Mail Sent!")
return "Sent Success!!"
if __name__ == '__main__':
app.run()
7.データベースモデル関係
a.一対一のモデルケース:一つの文章は一つの内容にしか対応していない
#
class Article(db.Model):
#
__tablename__ = 'tbl_article'
#
id = db.Column(db.Integer, primary_key=True) #
title = db.Column(db.String(128), unique=True) #
# ,
content = db.relationship('Acontent', backref='article', uselist=False) # uselist False
#
class Acontent(db.Model):
#
__tablename__ = 'tbl_acontent'
#
id = db.Column(db.Integer, primary_key=True) #
content = db.Column(db.Text(4000)) #
article_id = db.Column(db.Integer, db.ForeignKey('tbl_article.id'))
b.一対のマルチモデルケース:一つの分類の下に多くの文章がある
#
class Category(db.Model):
#
__tablename__ = 'tbl_category'
#
id = db.Column(db.Integer, primary_key=True) #
name = db.Column(db.String(32), unique=True) #
# ,
article = db.relationship('Article', backref='category')
#
class Article(db.Model):
#
__tablename__ = 'tbl_article'
#
id = db.Column(db.Integer, primary_key=True) #
title = db.Column(db.String(128), unique=True) #
category_id = db.Column(db.Integer, db.ForeignKey('tbl_category.id')) # id
# ,
content = db.relationship('Acontent', backref='article', uselist=False) # uselist False
c.多対多モデルケース:一つのラベルは多くの文章に対応し、一つの文章も多くのラベルに対応する
#
tbl_tags = db.Table('tbl_tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tbl_tag.id')),
db.Column('article_id', db.Integer, db.ForeignKey('tbl_article.id'))
)
#
class Tag(db.Model):
#
__tablename__ = 'tbl_tag'
#
id = db.Column(db.Integer, primary_key=True) #
name = db.Column(db.String(32), unique=True) #
#
class Article(db.Model):
#
__tablename__ = 'tbl_article'
#
id = db.Column(db.Integer, primary_key=True) #
title = db.Column(db.String(128), unique=True) #
category_id = db.Column(db.Integer, db.ForeignKey('tbl_category.id')) # id
# ,
content = db.relationship('Acontent', backref='article', uselist=False) # uselist False
tags = db.relationship('Tag', secondary=tbl_tags, backref='articles')
d.自己関連モデルケース:地域
#
class Area(db.Model):
#
__tablename__ = "tbl_area"
#
id = db.Column(db.Integer, primary_key=True) #
name = db.Column(db.Text, nullable=False) #
parent_id = db.Column(db.Integer, db.ForeignKey("tbl_area.id")) # id
# ,
parent = db.relationship("Area", remote_side=[id]) # remote_side