pip install flask-sqlalchemy
pip install flask-script
pip install flask-migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/sqlalchemy_test' # 绑定数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True # 跟踪对象的修改并发出信号但不发出警告
db = SQLAlchemy(app)
# 代码迁移配置
manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)
class User(db.Model):
__tablename__ = "user_account" # 数据库表名
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
fullname = db.Column(db.String(30))
sex = db.Column(db.String(30))
def __repr__(self):
return f"User(id={self.id!r}, name={self.name!r}, fullname={self.fullname!r})"
class Address(db.Model):
__tablename__ = "address"
id = db.Column(db.Integer, primary_key=True)
email_address = db.Column(db.String(30), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey("user_account.id"), nullable=False) # 定义外键约束
# 定义关系模型,可通过backref反向取
user = db.relationship('User', backref=db.backref('address', lazy=True), lazy=True)
def __repr__(self):
return f"Address(id={self.id!r}, email_address={self.email_address!r})"
Integer、String(size)、DateTime、Float、Boolean
更多数据类型:https://docs.sqlalchemy.org/en/14/core/type_basics.html#generic-types
primary_key:如果设为 True,这列就是表的主键
unique:如果设为 True,这列不允许出现重复的值
index:如果设为 True,为这列创建索引,提升查询效率
nullable:如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值
default :为这列定义默认值
更多配置选项:https://docs.sqlalchemy.org/en/14/core/metadata.html#sqlalchemy.schema.Column
# 创建迁移仓库--初始化
python manage.py db init
# 创建迁移脚本
python manage.py db migrate
# 更新数据库
python manage.py db upgrade
# 回退数据库
python manage.py db downgrade 版本号
每次数据库模型变化,需要重复使用migrate命令和upgrade命令(按顺序组合使用),使用成功后将修改版本号。
User.query返回的是一个BaseQuery对象,该对象支持sqlalchemy的许多查询API
filter() :把过滤器添加到原查询上,返回一个新查询
filter_by() :把等值过滤器添加到原查询上,返回一个新查询
limit():使用指定的值限制原查询返回的结果数量,返回一个新查询
offset():偏移原查询返回的结果,返回一个新查询
order_by():根据指定条件对原查询结果进行排序,返回一个新查询
group_by():根据指定条件对原查询结果进行分组,返回一个新查询
all():以列表形式返回查询的所有结果
first():返回查询的第一个结果,如果没有结果,则返回 None
first_or_404():返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误响应
get() :返回指定主键对应的行,如果没有对应的行,则返回 None
get_or_404():返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误响应
count():返回查询结果的数量
paginate():返回一个 Paginate 对象,它包含指定范围内的结果
更多查询API:https://docs.sqlalchemy.org/en/14/orm/query.html?highlight=cte#sqlalchemy.orm.Query