14 SQLAlchemy
一. 介绍
SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
- pip install sqlalchemy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
组成部分:
- 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. 创建数据库表
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()
- ######################方式二####################
# 方式二:支持线程安全,为每个线程创建一个session
# - threading.Local
# - 唯一标识
# ScopedSession对象
# self.registry(), 加括号 创建session
# self.registry(), 加括号 创建session
# self.registry(), 加括号 创建session
from greenlet import getcurrent as get_ident
Session = sessionmaker(bind=engine)
session = scoped_session(Session,get_ident)
# session.add
# 操作
session.remove()

基本增删改查补充

- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import time
- import threading
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
- from sqlalchemy.orm import sessionmaker, relationship
- from sqlalchemy import create_engine
- from sqlalchemy.sql import text
- from db import Users, Hosts
- 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()
- # ################ 添加 ################
- """
- obj1 = Users(name="wupeiqi")
- session.add(obj1)
- #批量添加
- session.add_all([
- Users(name="wupeiqi"),
- Users(name="alex"),
- Hosts(name="c1.com"),
- ])
- session.commit()
- """
- # ################ 删除 ################
- """
- session.query(Users).filter(Users.id > 2).delete()
- session.commit()
- """
- # ################ 修改 ################
- """
- session.query(Users).filter(Users.id > 0).update({"name" : "099"})
- session.query(Users).filter(Users.id > 0).update({Users.name: Users.name + "099"}, synchronize_session=False) #字符串
- session.query(Users).filter(Users.id > 0).update({"age": Users.age + 1}, synchronize_session="evaluate") #数字
- session.commit()
- """
- # ################ 查询 ################
- """
- r1 = session.query(Users).all()
- r2 = session.query(Users.name.label('xx'), Users.age).all() #lable #as xx
- r3 = session.query(Users).filter(Users.name == "alex").all()
- r4 = session.query(Users).filter_by(name='alex').all() #如果里面写条件就用filter_by,和上面filter查询是一回事,只是一种不同的方式
- r5 = session.query(Users).filter_by(name='alex').first()
- r6 = session.query(Users).filter(text("id<:value and name=:name")).params(value=224, name='fred').order_by(Users.id).all() #查询里面如果有动态传参的时候,吧它包在text里面,:value,:name这样的语法后面用.params来进行格式化
- r7 = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all() #上面的这个方式也可以用这一种 ,直接可以进行SQL语句的查询
- """
- session.close()
14 SQLAlchemy的更多相关文章
- Flask-论坛开发-3-数据库
对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 1. SQLAlchemy ...
- FlaskWeb开发从入门到放弃(二)
第5章 章节五 01 内容概要 02 内容回顾 03 面向对象相关补充:metaclass(一) 04 面向对象相关补充:metaclass(二) 05 WTforms实例化流程分析(一) 06 WT ...
- 三分钟了解 Python3 的异步 Web 框架 FastAPI
快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...
- 14.python与数据库之mysql:pymysql、sqlalchemy
相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查 ...
- 14、Flask实战第14天:Flask使用SQLAlchemy
flask-sqlalchemy使用详解 之前我们用到的SQLAchemy是可以单独使用的,不需要用到Flask 如果我们在Flask框架中使用SQLAchemy,可以使用flask_sqlalche ...
- Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- sqlalchemy(二)高级用法
sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...
- sqlalchemy入门记录
前言 发现翻译全文时间比较久,所以先整个简单的使用说明吧 安装SQLAlchemy pip install sqlalchemy 查看SQLAlchemy版本 In [1]: import sqlal ...
- python之SQLAlchemy
ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为 ...
随机推荐
- kotlin陪伴对象
在kotlin中并没有静态类成员的概念,但并不等于实现类似于静态类成员的功能,陪伴对象可以解决这个问题 fun main(arg: Array<String>) { val create ...
- android设置gps自动开启
1.第一种方法 private void toggleGPS() { Intent gpsIntent = new Intent(); gpsIntent.setClassName("com ...
- 安装完 MySQL 后必须调整的 10 项配置(转)
当我们被人雇来监测MySQL性能时,人们希望我们能够检视一下MySQL配置然后给出一些提高建议.许多人在事后都非常惊讶,因为我们建议他们仅仅改动几个设置,即使是这里有好几百个配置项.这篇文章的目的在于 ...
- MLN Alchemy
1. 前言: 本文主要参考Alchemy Tutorial, washington主页上挂出的所有Alchemy项目(包括Alchemy1.0, Alchemy2.0, AlchemyLite)都无法 ...
- ubuntu 16 搭建只能上传不可下载删除ftp服务
安装 VSFTPD,(建议使用FileZill测试,报错能看到原因) 如果使用window文件管理连接,要注意下图的设置 使用 apt-get 安装 vsftpd sudo apt-get insta ...
- centos安装软件
rpm指令, 该指令安装文件后缀.rpm的可执行程序 yum指令 安装软件源代码,后缀为 .tar.gz(用gzip压缩过的tar包) rpm rpm软件包格式为 (一)查询系统装已经安装的软件信息 ...
- 如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器
with open('rm_keys.txt', 'r', encoding = 'utf-8') as f: count = 0 for line in f: 7 count += 1 print( ...
- Blynk系列随笔
Blynk系列随笔 1.基于Blynk服务器搭建物联网测试Demo 2.本地 Blynk服务器搭建
- SIFT学习笔记之一 下载和调用
下面给出了多个参考地址,挑个能用的吧: vs2010+Rob Hess SIFT: http://blog.csdn.net/lanbing510/article/details/8507341 R ...
- 最新 映客java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.映客等10家互联网公司的校招Offer,因为某些自身原因最终选择了映客.6.7月主要是做系统复习.项目复盘.LeetCode ...