分三个命令
- 第一个命令一个项目只执行一次
- 当修改数据表字段时,需要重新执行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")