Flask连接数据库

Flask框架 2020-08-23 1093

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

该命令会更新修改的字段,在没有数据库时会自动创建数据库

标签:Flask框架

文章评论

评论列表

已有0条评论