flask之flask_sqlalchemy
一. 介绍
SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
| 
 1 
 | 
pip3 install sqlalchemy | 

组成部分:
- Engine,框架的引擎
 - Connection Pooling ,数据库连接池
 - Dialect,选择连接数据库的DB API种类
 - Schema/Types,架构和类型
 - SQL Exprression Language,SQL表达式语言
 
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] 更多:http://docs.sqlalchemy.org/en/latest/dialects/index.html
二. 使用
1. 执行原生SQL语句
import time
import threading
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.engine.base import Engine engine = create_engine(
"mysql+pymysql://root:123@127.0.0.1:3306/t1?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
) def task(arg):
conn = engine.raw_connection()
cursor = conn.cursor()
cursor.execute(
"select * from t1"
)
result = cursor.fetchall()
cursor.close()
conn.close() for i in range(20):
t = threading.Thread(target=task, args=(i,))
t.start()
注意: 查看连接 show status like 'Threads%';
2. ORM
a. 创建数据库表
创建单表
创建多个表并包含Fk、M2M关系
指定关联列:hobby = relationship("Hobby", backref='pers',foreign_keys="Person.hobby_id")
b. 操作数据库
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine) # 每次执行数据库操作时,都需要创建一个session
session = Session() # ############# 执行ORM操作 #############
obj1 = Users(name="alex1")
session.add(obj1) # 提交事务
session.commit()
# 关闭session
session.close()
多线程执行示例
基本增删改查示例
常用操作
原生SQL语句
基于relationship操作ForeignKey
基于relationship操作m2m
其他
基于scoped_session实现线程安全
普通模式下使用sqlalchemy对数据库进行操作
import threading
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users # 与数据库进行连接,并创建连接池
engine = create_engine(
"mysql+pymysql://root@127.0.0.1:3306/flask?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=10, # 连接池大小,一次性最多建立的连接数
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
)
# 生成会话类
Session = sessionmaker(bind=engine) def task(arg):
# 每次执行数据库操作时都要创建一个会话
session = Session()
session.query(Users).all()
session.close() for i in range(20):
t = threading.Thread(target=task, args=(i,))
t.start()
对于上述方式,每个线程里执行数据库的操作都要创建一个新的session会话,以保证当前线程操作的只是自己的会话对象,防止其他会话对象对当前线程中数据库操作的影响。但是这样不足之处在于需要为每个线程都要手动的创建session会话,那有没有其他比较好的方法为我们自动创建会话而且还能保证线程之间数据的安全?答案肯定是有的。
基于scoped_session实现操作数据库的线程安全
import threading
from sqlalchemy.orm import sessionmaker,scoped_session
from sqlalchemy import create_engine
from models import Users # 与数据库进行连接,并创建连接池
engine = create_engine(
"mysql+pymysql://root@127.0.0.1:3306/flask?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=10, # 连接池大小,一次性最多建立的连接数
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
)
# 生成会话类
Session = sessionmaker(bind=engine)
# 使用scoped_session创建一个单例的session,不需要为每次操作数据库创建会话
session = scoped_session(Session) def task(arg):
session.query(Users).all()
session.close() for i in range(20):
t = threading.Thread(target=task, args=(i,))
t.start()
使用scoped_session创建一个全局的会话对象,该对象使用threading.local会为每一个线程开辟一个内存空间,并实例化一个原来Session类对象,将该对象保存到所创建的线程中去,从而保证了线程之间的数据安全。源码:
session = scoped_session(Session)
class scoped_session(object):
    def __init__(self, session_factory, scopefunc=None):
        # session_factory == Session = sessionmaker(bind=engine),即创建的会话Session类
        self.session_factory = session_factory
        if scopefunc:
            self.registry = ScopedRegistry(session_factory, scopefunc)
        else:
            # self.createfunc = createfunc
            # self.registry = threading.local(),每创建一个 scoped_session 类实例则创建一个线程
            # 创建的 ThreadLocalRegistry 类实例拥有以上两个属性
            self.registry = ThreadLocalRegistry(session_factory)
class ThreadLocalRegistry(ScopedRegistry):
"""A :class:`.ScopedRegistry` that uses a ``threading.local()``
variable for storage. """ def __init__(self, createfunc):
# createfunc == Session类
self.createfunc = createfunc
self.registry = threading.local()
flask_sqlalchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# SQLAlchemy 类实例对象的创建一定要在引用蓝图之前,因为db会在各个蓝图中调用进行数据库操作
db = SQLAlchemy()
from sansa.views.account import account
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand def create_app():
"""
创建app
:return:
"""
app = Flask(__name__)
app.config.from_object("settings.Development")
# 初始化db,读取app中关于数据库连接的配置信息,一定要放在导入配置之后
db.init_app(app)
app.register_blueprint(account)
# 创建项目管理器
manager = Manager(app)
# 创建数据库迁移管理实例
migrate = Migrate(app,db)
# 为管理器添加一个db的命令
manager.add_command("db",MigrateCommand)
return manager
from sansa import db # 在数据库创建表一张表
class Users(db.Model):
__tablename__ = 'users' id = db.Column(db.Integer, primary_key=True)
# name = db.Column(db.String(32), index=True, nullable=False) # 在数据库创建表一张表
class School(db.Model):
__tablename__ = 'school' id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), index=True, nullable=False)
flask之flask_sqlalchemy的更多相关文章
- Flask框架—flask_sqlalchemy组件使用
		
一.flask_sqlalchemy组件 我们之前学过SQLAlchemy,一个独立的数据库关系对象映射,其实在flask中也有官方认可的第三方SQLAlchemy组件,用于处理flask中对象关系映 ...
 - flask使用flask_sqlalchemy连接数据库(python2.7)
		
1.出现编码问题 解决方法: #连接数据库时出现编码问题,需要pip install mysql-connector-python,并且数据库配置修改为 import mysql.connector ...
 - flask程序部署在openshift上的一些注意事项
		
https://www.openshift.com/blogs/how-to-install-and-configure-a-python-flask-dev-environment-deploy-t ...
 - [Python][flask][flask-wtf]关于flask-wtf中API使用实例教程
		
简介:简单的集成flask,WTForms,包括跨站请求伪造(CSRF),文件上传和验证码. 一.安装(Install) 此文仍然是Windows操作系统下的教程,但是和linux操作系统下的运行环境 ...
 - [python][flask][flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程
		
鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流. 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文 ...
 - flask框架+pygal+sqlit3搭建图形化业务数据分析平台
		
一. 前言 先说下主要的框架和主要的图形库的特点:(个人见解) Django:python开发的一个重量级的web框架,集成了MVC和ORM等技术,设计之初是为了使开发复杂的.数据库驱动的网站变得简单 ...
 - 从零开始用 Flask 搭建一个网站(一)
		
前言 笔者之前未接触过 Python,只是略懂一点前端,所以说从零开始也相差无几吧.Flask 是一个轻量级的基于 Python 的框架,但是扩展性非常良好(Github 上 22000 多个 sta ...
 - flask 扩展之 -- flask-sqlalchemy
		
flask-sqlalchemy.md 一. 安装 $ pip install flask-sqlalchemy 二. 配置 配置选项列表 : 选项 说明 SQLALCHEMY_DATABASE_UR ...
 - python web开发-flask中sqlalchemy的使用
		
SqlAlchemy是一个python的ORM框架. 在flask中有一个flask-sqlalchemy的扩展,使用起来很方便. 1. 创建一个sqlalchemy的Model模块 创建 ...
 
随机推荐
- 深入浅出 JMS(一) - JMS 基本概念
			
深入浅出 JMS(一) - JMS 基本概念 一.JMS 是个什么鬼 JMS 是 Java Message Service 的简称,即 Java 消息服务.什么是消息服务呢,我们来看一下 Oracle ...
 - MySQL相关知识总结
			
1. 显示所有表 show tables; 还有information_schema数据库里面有tables表,记录了所有表信息 use information_schema; select * fr ...
 - Linux编程规范
			
1)在使用C语言进行编程时,源文件都必须加---文件头 /******************************************************** *文件名:test.c *创 ...
 - 让kbmmw 4.8 支持ios 64
			
随着xe8 的出来,其开始支持IOS 64 的编译了(不支持也没办法,从今年2月开始不支持ios 64 的应用 就不允许入住apple appstore,霸气呀).相信不少同学迫不及待的开始了ios6 ...
 - KBMMW 4.80.00 发布
			
一大波更新来了. 4.80.00 March 30 2015 Important notes (changes that may break existing code) ======= ...
 - 美团点评2017校招笔试真题-算法工程师A
			
美团点评2017校招笔试真题-算法工程师A 1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. map 正确答案: B STL的容器可以分为以下 ...
 - 2018.10.08 NOIP模拟 栅栏(树状数组+rand)
			
传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...
 - 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)
			
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln, ...
 - 微信JSSDK分享接口
			
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js& ...
 - 42 Can stress be Avoided ? 压力能够回避吗 ?
			
Can stress be Avoided ? 压力能够回避吗 ? ①In the 1960s, medical researchers Thomas Holmes and Richard Rahe ...