记录SQLAlchemy在Flask中的应用

install

上文写到使用ORM进行快速开发,本文简述ORM在Flask开发中的应用。sqlalchemy可以直接用于Flask中,但通过Flask-SQLAlchemy模块,可以很好地把sqlalchemy模块嵌入到Flask的上下文中。

关于ORM的基本概念和sqlalchemy模块参考旧文使用ORM进行快速开发

本文需要使用到的模块:

1
2
3
pip3 install -U flask
pip3 install -U flask-sqlalchemy
pip3 install -U pymysql

初步使用

首先我们需要sqlalchemyFlask中初始化。SQLAlchemy对象会自动从app实例中获取配置信息,管理数据库连接。

Config类中指定SQLAlchemy的配置信息。SQLALCHEMY_DATABASE_URI指定数据库的URL路径,上面说过。SQLALCHEMY_ECHO是布尔类型,表明是否把和数据库交互的信息打印出来。

1
2
3
4
5
6
7
8
9
10
from flask_sqlalchemy import SQLAlchemy
from flask import Flask

class Config:
SQLALCHEMY_ECHO = True
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:root@localhost:3306/flask"

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)

db对象包括了定义数据库模型时字段的类型信息,常见的类型如下。

  • db.Integer
  • db.String
  • db.Float
  • db.Text
  • db.Boolean
  • db.Date
  • db.DateTime

其中前三个类可以接收一个参数,表示存储长度的大小。Integer默认的长度为11。

创建第一个模型,新的模型继承自db.Modeldb.Model常用的参数有两个,第一个参数指定字段的名字,第二个参数指定字段在数据库中的类型信息。通常第一个字段如果省略,SQLAlchemy会自动把当前类的属性名当做数据库的字段名字。

1
2
3
4
5
6
7
8
9
10
11
12
class User(db.Model):
__tablename__ = 'user'

id = db.Column(db.Integer(), primary_key=True)
username = db.Column(db.String(255))
password = db.Column(db.String(255))

def __init__(self, username):
self.username = username

def __repr__(self):
return "<User {}>".format(self.username)

由于上面的User模型中Column都指定字段名,因此SQLAlchemy就把idusernamepassword分别作为数据库的字段名字。

创建表

通过db.create_all()创建我们定义的模型到数据库中。在交互模式下(例如白跑一趟hon)运行上面的代码,然后输入如下代码。

1
2
>>> db.drop_all() # 删除数据库中的表
>>> db.create_all()

实际上,上述模型对应的SQL代码如下

1
2
3
4
5
6
7
8
9
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NULL DEFAULT NULL,
`password` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

我们可以对比这段SQL代码和上面定义的User类,感受它们之间的映射关系。

操作例子

基于sqlalchemy模块的CRUD在使用ORM进行快速开发一文已经提到。这部分讲讲添加、读取、修改、删除在Flask中的运用。这四类数据库操作都是建立在会话(session)上,它由SQLAlchemy对象维护着。接下来的代码实例假定在交互式(如IDLE、bpython3)上完成。

添加一个数据对象

1
2
3
>>> user = User(username='allen', password='******')
>>> db.session.add(user)
>>> db.session.commit()

添加多个数据对象

1
2
3
>>> users = [user(username=name) for name in ('allen', 'allenwind')]
>>> db.session.add_all(users)
>>> db.commit()

转载请包括本文地址:https://allenwind.github.io/blog/4677
更多文章请参考:https://allenwind.github.io/blog/archives/