Flask ORM方法
安装
安装步骤非常简单,前提是安装了pip的话
pip install flask-sqlalchemy
数据库设置
在Flask中,既可以使用关系型数据库,还可以使用非关系型数据库。
对于关系型数据库,常见的有这么几个,sqlite3, MySQL, PostgreSQL, Oracle, MSSQL
SQLAlchemy连接数据库的时候需要一个特殊的URI(统一资源定位符)来创建数据库的连接。这个URI的是一个有特殊格式的字符串,包含了SQLAlchemy连接数据库所需要的所有信息。
从上面也可以看出,需要driver 的支持。当然,这个driver是需要你自己手动安装的。对于这几个数据库而言,常见的URI如下:
SQLite:
sqlite:///database.db
MySQL:
mysql+pymysql://user:password@ip:port/db_name
PostgreSQL:
postgresql+psycopg2://user:password@ip:port/db_name
MSSQL:
mssql+pyodbc://user:password@ip:port/db_name
Oracle:
oracle+cx_oracle://user:password@ip:port/db_name
由于Flask可以通过一个类对象来加载相关的配置。所以我们可以轻松的把这些配置信息,写到一个类中,这样对于代码的管理和维护都会十分的有帮助。
比如我们可以这么写:
class Config(object): DEBUG = True SQLALCHEMY_DATABASE_URI = "path.db"
然后可以通过下面的这行代码进行加载app.config.from_object(Config)
使用
在Flask中,要想使用某一个拓展,仅仅需要把flask对象当做构造参数传递给拓展类即可。
比如拓展一个管理类:
from flask.ext.script import Managerfrom flask import Flaskapp = Flask(name)manager = Manager(app)
然后就可以使用manager对象开始对flask应用进行管理了
再者,拓展一个数据库:
from flask import Flaskfrom flask.ext.sqlalchemy import SQLAlchemyclass Config(object): SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"app = Flask(name)
需要加载一下数据库的URI等配置信息app.config.from_object(Config)# 开启对数据库的拓展db = SQLAlchemy(app)
关系
在关系型数据库中,最最常见的应该就是什么一对多,多对多了。对于单表操作,多表操作。使用ORM其实还是有点晦涩的。
毕竟相对于原生的SQL语句而言,需要掌握一些额外的语法。但是熟悉了这个套路之后,就不会很烦躁了。反而会通过流处理获取到一丝畅快。
单表操作
在开始具体的操作之前,还是得先有表结构才行。与原生的SQL相比,建表啊什么的不需要我们手动执行了。通过ORM框架可以自动生成相关的表结构。(相关的前提还是得先定义好类的模式)
“建表”
下面先来创建一个单表model.py:
coding: utf8
from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flask
##################### 数据库路径等相关配置选项####################
class Config(object):
SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"
app = Flask(name)
app.config.from_object(Config)# 拓展数据库相关内容
db = SQLAlchemy(app)
##################### 开始制作模型####################
class User(db.Model):
id = db.Column(db.Integer(), primary_key=True)
username = db.Column(db.String(255))
password = db.Column(db.String(255))
def init(self, username, password):
self.username = username
self.password = password
def repr(self):
return "<[User] username:{}, password:{}".format(self.username, self.password)
然后是一个管家,来操作这个模型。main.py
coding: utf8
from model import app, db, User
from flask.ext.script import Manager, Server
通过拓展来管理flask应用
manager = Manager(app)
添加自定义命令,通过python main.py server就可以开启manager.add_command('server', Server)
创建在命令行里面的上下文环境
@manager.shelldef make_shell_context():
return dict(app=app, db=db, User=User)
if name == 'main':
manager.run()
执行下面的命令,我们就可以在命令行里面操作这张表了
python main.py shell
应用表结构
对于刚才的模型来说,我们确实是创建好了,但也只是创建好了。还没应用到数据库中。可以查看一下项目目录,是否有test.db出现。

要想让其表现在数据库中,还需要下面的一条语句
db.create_all()

然后可以使用软件来查看一下里面的表结构是否为我们预先设计好的


一对多
一对多操作,比如一个用户可以发表多篇博客。所以我们可以设计下面的这个模型model.py
coding: utf8
from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flaskimport datetime
##################### 数据库路径等相关配置选项####################
class Config(object):
SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"
app = Flask(name)
app.config.from_object(Config) # 拓展数据库相关内容
db = SQLAlchemy(app)
##################### 开始制作模型####################
class User(db.Model):
id = db.Column(db.Integer(), primary_key=True)
username = db.Column(db.String(255))
password = db.Column(db.String(255))
# 一对多反馈
posts = db.relationship("Post", backref='user', lazy='dynamic')
def init(self, username, password):
self.username = username
self.password = password
def repr(self):
return "<[User] username:{}, password:{}".format(self.username, self.password)class Post(db.Model):
id = db.Column(db.Integer(), primary_key=True)
title = db.Column(db.String(255))
text = db.Column(db.Text())
publish_time = db.Column(db.DateTime())
user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))
def init(self, title):
self.title = title
self.publish_time = datetime.datetime.now()
def repr(self):
return "<[Post] title:{}>".format(self.title)
相应的,main.py也需要稍作修改。
coding: utf8
from model import app, db, User, Post
from flask.ext.script import Manager, Server
通过拓展来管理flask应用
manager = Manager(app)
添加自定义命令,通过python main.py server就可以开启
manager.add_command('server', Server)
创建在命令行里面的上下文环境
@manager.shelldef make_shell_context():
return dict(app=app, db=db, User=User, Post=Post)
if name == 'main': manager.run()
执行
Python main.py shell
查看数据库中的信息


多对多
模型类 model.py
coding: utf8
from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flaskimport datetime
##################### 数据库路径等相关配置选项####################
class Config(object):
SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"
app = Flask(name)app.config.from_object(Config)
# 拓展数据库相关内容
db = SQLAlchemy(app)
##################### 开始制作模型####################
class User(db.Model):
id = db.Column(db.Integer(), primary_key=True)
username = db.Column(db.String(255))
password = db.Column(db.String(255))
# 一对多反馈
posts = db.relationship("Post", backref='user', lazy='dynamic')
def init(self, username, password):
self.username = username
self.password = password
def repr(self):
return "<[User] username:{}, password:{}".format(self.username, self.password)
db.Colu tags = db.Table('post_tags',db.Column('post_id', db.Integer(), db.ForeignKey('post.id')),mn('tag_id', db.Integer(), db.ForeignKey('tag.id')))
class Post(db.Model):
id = db.Column(db.Integer(), primary_key=True)
title = db.Column(db.String(255))
text = db.Column(db.Text())
publish_time = db.Column(db.DateTime())
user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))
comments = db.relationship("Comment", backref='post', lazy='dynamic')
tags = db.relationship('Tag',secondary=tags,backref=db.backref('posts', lazy='dynamic'))
def init(self, title):
self.title = title
self.publish_time = datetime.datetime.now()
def repr(self):
return "<[Post] title:{}>".format(self.title)
class Comment(db.Model):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(255))
text = db.Column(db.Text())
date = db.Column(db.DateTime())
post_id = db.Column(db.Integer(), db.ForeignKey('post.id'))
def init(self, name):
self.name = name
self.date = datetime.datetime.now()
def repr(self):
return "<[Comment] name:{}>".format(self.name)
class Tag(db.Model):
id = db.Column(db.Integer(), primary_key=True)
title = db.Column(db.String(255))
def init(self, title):
self.title = title
def repr(self):
return "<[Tag] title:{}>".format(self.title)
修改main.py
coding: utf8
from model import app, db, User, Post, Tag, Commentfrom
flask.ext.script import Manager, Server
通过拓展来管理flask应用
manager = Manager(app)
添加自定义命令,通过python main.py server就可以开启
manager.add_command('server', Server)
创建在命令行里面的上下文环境
@manager.shelldef make_shell_context():
return dict(app=app, db=db, User=User, Post=Post, Comment=Comment, Tag=Tag)
if name == 'main': manager.run()
执行:python main.py shell
进入到命令行后,执行
db.create_all()
我们所做的模型设计就会被反馈到数据库中

浙公网安备 33010602011771号