首页 > 代码库 > Python flask-sqlalchemy初级解析

Python flask-sqlalchemy初级解析

flask-SQLAlchemy 是一个为您的flask应用增加SQLAlchemy支持的扩展。

在python扩展库中其实包含了SQLAlchemy。在版本的不断叠加后,已经被整合到flask架构中,flask-SQLAlchemy简化在Flask中SQLAlchemy的使用,提供了有用的默认值和额外的助手来更简单地完成常见任务。

笔者认为SQLAlchemy比较精髓的是使用ORM(对象关系映射),相对于传统连接数据库使用select,update,insert,delete操作数据表来说具有以下特点[1]:

  简单——以最基本的形式建模数据

  传达性——数据库结构被任何人都能理解的语言文档化

  精确性——基于数据模型创建正确标准化的结构

完事无绝对,ORM有明显的优势,就会想伴随有缺点。

  隐蔽性——相对于传统使用select,update,insert,delete来说,隐藏了操作数据表的具体操作,不利于SQL的学习

  数据表结构修改难——在设计中有时会忽略了一些字段的定义,在ORM模式中只能更新映射表更新字段,而且效果远不如alter table [表名] add 字段名更新字段来的容易理解,常常会忽略一些细节

 

但不得不说,ORM模式的确打开了新世界的大门,大大减少了学习及使用数据库的过程与难度。

 

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘sqlite:///‘ + os.path.join(basedir, ‘test.db‘)
app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = False
db = SQLAlchemy(app)

def db_init():
db.create_all()

一句一句解释

(1)from flask import Flask

Flask类是flask框架的核心类,它实现了WSGI应用规范。

(2)from flask_sqlalchemy import SQLAlchemy

将flask-sqlchemy中内置的SQLAlchemy引用到该文件下。

(3)import OS

本实例中需要将数据库创建在工程的更目录下,使用python内置os库可以很方便的定位到工程路径下。

(4)basedir = os.path.abspath(os.path.dirname(__file__))

将当前文件传入dirname函数中,获取当前文件所在路径,abspath函数获取该文件所在的绝对路径,以便在后边配置创建数据库的路径使用。

(5)app = Flask(__name__) [2]

Flask构造函数的第一个参数指定一个引入参数/importname。

Flask框架使用这个名字进行静态资源、模板、错误信息的定位。除非你清楚的理解它的作用,通常情况下,我们总应该使用特殊变量__name__。

Flask实例是可调用的(具有call方法),这个实例可以直接对接 WSGI服务器。

(6)app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘sqlite:///‘ + os.path.join(basedir, ‘test.db‘)

       app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = False

SQLALCHEMY_DATABASE_URI:用于连接数据库

  eg:sqlite:////tmp/test/db

    mysql://username:password@server/db

SQLALCHEMY_TRACK_MODIFICATIONS:

如果设置成True(默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。如果你不显示的调用它,在最新版的运行环境下,会显示警告。

(7)db = SQLAlchemy(app)

SQLAlchemy函数,将刚刚创建的Flask框架,与工程所需要使用的数据库绑定到一起,以便实现工程与数据库连接,实现数据操作。

(8)db_init()函数

手动创建函数,以便初始化数据库

 

from database import db

class User(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(80), unique=True)
  email = db.Column(db.String(120), unique=True)

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

def __repr__(self):
  return ‘<User {}>‘ .format(self.usernam)

 

仍然是逐句解释

(1)from database import db

将刚刚创建的SQLAlchemy应用引用到当前文件,以便将映射表映射到数据库中,以便对于数据表的创建修改以及更新删除。

(2)db.Model

上边提到,当工程文件不提供映射表时将创建一个空的数据库文件。继承db.Model类,将我们当前创建的映射表和数据库db绑定在一起。此时工程文件调用create_all函数后,会自动将绑定后的映射表文件创建在数据库文件中。

如果想探究详细绑定关系,请应用纯SQlAlchemy库,而不是flask-sqlalchemy库,之前调到了flask-sqlalchemy是简化版的SQLAlchemy,隐藏了许多细节,深入研究请转至SQLAlchemy官方文档查看应用细节。

(3)db.Column

创建映射表字段,以下为最常见的类型

Integer 存储整数
String(size) 存储有长度的字符串
Text 存储较长的unicode文本
DateTime 存储时间类型数据
Float 存储浮点值
Boolean 存储布尔值
PickleType 存储一个python对象
LargeBinary 存储一个任意大的二进制数据

 

 

 

 

 

 

primary_key=True设置当前字段为主键

uniqu=True设置当前字段不可重复

当然也可以设置主键外键,在本文中只创建了一张数据表,在以后的文章中将说明此操作。

(4)__init__函数

为映射表的构造函数,一般用来初始变量,配置相关数据时使用

(5)__repr__函数

为以后调试输出提供接口

 

后续有时间再进行添加总结,关于ORM多对多关系中的注意事项以及优化查询.

 

Python flask-sqlalchemy初级解析