from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# mysql数据库连接:mysql://username:password@localhost:3306/flask
# sqlite数据库:sqlite:///path/sqlite3
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:huyu1680456489@localhost/flask"
# 追踪对象的修改,用于Flask-SQLAlchemy通知系统,不加会出现警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
@app.route('/')
def hello_world():
    return 'Hello World!'
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(36), unique=True, nullable=False, )
    email = db.Column(db.String(255), unique=True, nullable=False)
    def __repr__(self):
        return self.username
db.create_all()  # 建立表
if __name__ == '__main__':
    app.run()
模型
| 类型名 | Python类型 | 说明 | 
|---|---|---|
| Integer | int | 普通整数,一般是 32 位 | 
| SmallInteger | int | 取值范围小的整数,一般是 16 位 | 
| Big Integer | int 或 long | 不限制精度的整数 | 
| Float | float | 浮点数 | 
| Numeric | decimal.Decimal | 定点数 | 
| String | str | 变长字符串 | 
| Text | str | 变长字符串,对较长或不限长度的字符串做了优化 | 
| Unicode | unicode | 变长 Unicode 字符串 | 
| Unicode Text | unicode | 变长 Unicode 字符串,对较长或不限长度的字符串做了优化 | 
| Boolean | bool | 布尔值 | 
| Date | datetime.date | 日期 | 
| Time | datetime.time | 时间 | 
| DateTime | datetime.datetime | 日期和时间 | 
| Interval | datetime.timedelta | 时间间隔 | 
| Enum | str | 一组字符串 | 
| PickleType | 任何 Python 对象 | 自动使用 Pickle 序列化 | 
| LargeBinary | str | 二进制文件 | 
常用 SQLAlchemy 列选项
| 选项名 | 说明 | 
|---|---|
| primary_key | 如果设为 True,这列就是表的主键 | 
| unique | 如果设为 True,这列不允许出现重复的值 | 
| index | 如果设为 True,为这列创建索引,提升查询效率 | 
| nullable | 如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值 | 
| default | 为这列定义默认值 | 
一些既定的约束标准:
姓名(英文)一般 70字符
中文一般不超过20字符
电子邮件一般不超过254字符
用户名一般不超过36字符
可以通过以下代码查看建表语句
from sqlalchemy.schema import CreateTable
print(CreateTable(User.__table__))
CURD操作
1.create
>>> from app import db, User
>>> user1 = User(username='小明', email='123456@qq.com')
>>> user2 = User(username='小红', email='456789@qq.com')
>>> db.session.add(user1)
>>> db.session.add(user2)
>>> db.session.commit()
除了使用add()添加数据,还可以使用add_all()一次添加多条数据
2.read
一般来说,一次完整的查询如下:
<模型类>.query.<过滤方法>.<查询方法>
SQLAlchemy常用查询方法
| 查询方法 | 说明 | 
| all() | 返回查询所有内容 | 
| first() | 返回查询到的第一条数据,找不到返回None | 
| one() | 返回第一条数据,且仅允许有1条数据。如果记录数量大于小于1,都报错 | 
| get(ident) | 传入主键作为参数,返回指定主键的记录,找不到返回None | 
| count() | 返回查询结果数量 | 
| one_or_none() | 类似one(),结果数量不为1,返回None | 
| first_or_404() | 返回查询的第一条记录,找不到返回404 | 
| get_or_404(ident) | 传入主键作为参数,找不到数据返回404 | 
| paginate() | 返回一个Paginate对象,对数据进行分页 | 
| with_parent(instance) | 传入模型类实例作为参数,返回和这个实例相关联的对象 | 
users = User.query.all()
first_user = User.query.first()
user = User.query.get(1)
print(users, type(users), first_user, user) # [小明, 小红] <class 'list'> 小明 小明
过滤方法:
| 查询过滤器名称 | 说 明 | 
| filter() | 使用指定的规则过滤记录,返回新产生的查询对象 | 
| filter_by() | 以关键字表达式过滤记录 | 
| order_by() | 以指定对象对记录排序,产生新对象 | 
| limit() | 使用指定值,限制查询返回的数量 | 
| group_by() | 根据指定的条件对记录进行分组 | 
| offset() | 使用指定的值偏移原查询结果 | 
3.Update
>>> user = User.query.get(2)
>>> user.email = '666@qq.com'
>>> db.session.commit()
4.Delete
>>> user = User.query.get(2)
>>> db.session.delete(user)
>>> db.session.commit()
Flask数据迁移
使用如下命令安装工具包:
pip install flask-migrate
在app中配置
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:huyu1680456489@localhost/flask"
# 追踪对象的修改,用于Flask-SQLAlchemy通知系统,不加会出现警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# 迁移操作
migrate = Migrate(app, db)
one:创建迁移环境
命令:flask db init
该命令会在app下创建一个migrate目录,包含自动生成的配置文件和迁移版本文件夹
two:生成迁移脚本(此步骤,可以自动在数据库创建表)
命令:flask db migrate -m "add table"
-m选项为迁移备注信息
three:更新数据库
命令:flask db upgrade
该命令会更新修改的字段,在没有数据库时会自动创建数据库
评论列表
已有0条评论