Flaskベース-(データベース操作)

13821 ワード

1.mysqlデータベースの接続と構成
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