flask-migrate和flask-script实现命令行对数据表进行迁移

分三个命令

  • 第一个命令一个项目只执行一次
  • 当修改数据表字段时,需要重新执行2,3命令

python manage.py db init
python manage.py db mirgate
python manage.py db upgrade

项目目录

- 项目文件夹
	- manage.py
	- settings.py
	- mir_sql_test
		- __init__.py
		- models.py

manage.py

from flask import Flask
from flask_script import Manager
from flask_migrate import MigrateCommand, Migrate
from mir_sql_test import db, User


app = Flask(__name__)


app.config.from_object("settings.Config")
manager = Manager(app)
db.init_app(app)
Migrate(app, db)
manager.add_command("db", MigrateCommand)

@app.route("/")
def index():
    # obj1 = User(name="123", email="[email protected]")
    # # 5. 把对象通过add放入
    # db.session.add(obj1)
    # 6. 提交
    # db.session.commit()
    conn = db.session
    res = conn.query(User).filter_by(name="xiaoda").first()
    # res = conn.query(User).filter(User.id>3).delete()

    return res.name

if __name__=="__main__":
    manager.run()

settings.py

class Config(object):

    DEBUG = True
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:[email protected]:3306/dd?charset=utf8"
    SQLALCHEMY_POOL_SIZE = 5
    SQLALCHEMY_POOL_TIMEOUT = 30
    SQLALCHEMY_POOL_RECYCLE = -1

    SQLALCHEMY_TRACK_MODIFICATIONS = True

__init__.py

from .models import *

models.py

# 字段和字段属性
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
from sqlalchemy.orm import relationship
from flask_sqlalchemy import SQLAlchemy
import datetime

db = SQLAlchemy()
Base = db.Model

class User(Base):
    __tablename__ = "users" # 默认以类名小写作为表名
    id = Column(Integer, primary_key=True) # id 主键
    # mysql中主键自动建索引:聚簇索引
    # 其他索引叫辅助索引
    name = Column(String(32), index=True, nullable=False) # name列, 索引, 不可为空
    email = Column(String(32), unique=True) # 唯一
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text, nullable=True)

    # 类似于django的Meta
    __table_args__ = (
        UniqueConstraint("id", "name", name="uix_id_name"), #联合唯一
        Index("ix_id_name", "name", "email"),  # 索引
    )

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name

# 一对多关系

# 一个Hobby可以有很多人喜欢
# 一个人只能有一个Hobby
class Hobby(Base):
    __tablename__ = "hobby"
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default="篮球")

class Person(Base):
    __tablename__ = "person"
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    # hobby指的是tablename而不是类名, uselist=False
    # 一对多的关系, 关联字段写在多的一方
    hobby_id = Column(Integer, ForeignKey("hobby.id"))  # 可以为空

    # 跟数据库无关, 不会新增字段, 只用于快速链表操作
    # 类名, backref 用于反向查询
    # Hobby.pers可以拿到所有的Person对象
    hobby = relationship("Hobby", backref="pers")

# 多对多
# 第三张表
class Boy2Girl(Base):
    __tablename__ = "boy2girl"
    id = Column(Integer, primary_key=True, autoincrement=True)  # 默认为True自增
    girl_id = Column(Integer, ForeignKey("girl.id"))
    boy_id = Column(Integer, ForeignKey("boy.id"))

class Girl(Base):
    __tablename__ = "girl"
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)

class Boy(Base):
    __tablename__ = "boy"

    id = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(64), unique=True, nullable=False)

    # 与生成表结构无关, 仅用于查询方便, 放在哪个表单中都可以
    # secondary 指定通过哪个表建立关联
    girls = relationship("Girl", secondary="boy2girl", backref="boys")

猜你喜欢

转载自blog.csdn.net/qq_46456049/article/details/112690432