1、简介

(1)ORM(Object Relationship Mapping):模型关系映射,把关系数据库的表结构映射到对象上

  • ORM优点:
  • 隐藏数据访问细节,提高开发效率
  • 构造数据结构变得简单
  • ORM缺点:
  • 降低执行效率,增加学习成本
  • 无法进行复杂的查询

(2)flask_sqlalchemy是一套ORM框架。

(3)安装:pip install flask-sqlalchemy

2、配置连接与初始化

(1)在config.py文件添加配置信息

由于我的是python3.6,故安装的mysql驱动是pymysql,即'pip install pymysql',如是python2,则安装的驱动是mysqldb。

# 数据库连接遵循这个语句
# dialect+driver://username:password@localhost:port/database?charset=utf8
DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
PASSWORD = 'root'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'db_dome1'   #要连接的数据库的名称,要先创建好这个数据库

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)

SQLALCHEMY_TRACK_MODIFICATIONS = False      # 不提示警告

说明:

  • pymysql是数据库驱动名称,经我自己使用情况下只有这个驱动能用,mysqldb无法成功连接;另:在flask_sqlalchemy中无需单独使用pip命令安装就可以直接使用
  • 在本机下使用默认情况下数据库服务器地址就填localhost或者127.0.0.1MySQL默认端口为3306不填此项则为默认值
  • 编码方式推荐使用UTF8,Python3默认编码也是UTF8,此项填入charset=utf8即可(注意不是utf-8,加-会报错)
     

(2)导入用flask_sqlalchemy中的SQLAlchemy进行初始化,并引入配置文件

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config


app = Flask(__name__)      
app.config.from_object(config)      #引入配置文件
db = SQLAlchemy(app)                #实例化

db.create_all() #将模型创建到数据库中(只创建,后续有变化不会修改,如字段有变动需要再数据库把表删掉)

可以运行下,测试一下是否与数据库连接成功。

实例

config.py文件

# 数据库连接遵循这个语句
# dialect+driver://username:password@localhost:port/database?charset=utf8
DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
PASSWORD = 'root'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'db_dome1'   #要连接的数据库的名称,要先创建好这个数据库

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)

SQLALCHEMY_TRACK_MODIFICATIONS = False      # 不提示警告

simple.py主文件

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config

app = Flask(__name__)       #引入配置文件
app.config.from_object(config)
db = SQLAlchemy(app)

# 一定要记得让其继承自db.Model
class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key= True, autoincrement = True) 
    username = db.Column(db.String(100), nullable = False)

# 创建映射表
class Article(db.Model):    #模型必须继承db.Model
    #db.Column映射到表中字段,primary_key主键,autoincrement自增,nullable可为空(默认为True)
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key= True, autoincrement = True) 
    title = db.Column(db.String(100),nullable = False)
    content = db.Column(db.Text, nullable = False)
    author_id = db.Column(db.Integer,db.ForeignKey('user.id'))#user是表名,关联user表的id字段
    
    #反向引用,'User'为模型名字,即上面定义的类名
    author = db.relationship('User',backref=db.backref('article'))

db.create_all() 

@app.route('/')
def hello_world():
    return "hello world"

if __name__ == '__main__':
    app.run()

3、SQLAlchemy模型与表映射

 

(1)模型需要继承自db.Model,映射到表中的属性需写成db.Column的数据类型。

(2)数据类型:

  • db.Integer
  • db.String(100)
  • db.Text 是 Text

(3)其他参数

  • primary_key=True 是值设为主键
  • autoincrement=True 是指可自增长
  • nullable=False

(4)最后需要db.create_all() 来将模型真正的创建到数据库中。

对比:

SQL语句代码:

create table article (
     id int primary key autoincrement,
     title varchar(100) not null,
     content text not null
)

python代码:

# 首先继承自db.Model
class Article(db.Model):
    __tablename__ = 'article' # 指定一个表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)

db.create_all()     #将模型映射到数据库中

以上笔记整理自知了课堂黄勇老师讲解的教学视频《Flask框架入门到实战开发》的第三章第1-6小节的学习笔记,不足之处,望不吝赐教!