0
点赞
收藏
分享

微信扫一扫

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

分三个命令

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

​python manage.py db init​​​​python manage.py db migrate​​​​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="dw3@qq.com")
# # 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:root@127.0.0.1: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")


举报

相关推荐

0 条评论