一. 介绍

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

  1.  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,从而实现对数据库的操作,如:

  1. MySQL-Python
  2. mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
  3.  
  4. pymysql
  5. mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
  6.  
  7. MySQL-Connector
  8. mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
  9.  
  10. cx_Oracle
  11. oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
  12.  
  13. 更多:http://docs.sqlalchemy.org/en/latest/dialects/index.html

二. 使用

1. 执行原生SQL语句

  1. import time
  2. import threading
  3. import sqlalchemy
  4. from sqlalchemy import create_engine
  5. from sqlalchemy.engine.base import Engine
  6.  
  7. engine = create_engine(
  8. "mysql+pymysql://root:123@127.0.0.1:3306/t1?charset=utf8",
  9. max_overflow=0, # 超过连接池大小外最多创建的连接
  10. pool_size=5, # 连接池大小
  11. pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
  12. pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
  13. )
  14.  
  15. def task(arg):
  16. conn = engine.raw_connection()
  17. cursor = conn.cursor()
  18. cursor.execute(
  19. "select * from t1"
  20. )
  21. result = cursor.fetchall()
  22. cursor.close()
  23. conn.close()
  24.  
  25. for i in range(20):
  26. t = threading.Thread(target=task, args=(i,))
  27. t.start()
 
 

注意: 查看连接 show status like 'Threads%';

2. ORM

a. 创建数据库表

 创建单表
 创建多个表并包含Fk、M2M关系

b. 操作数据库表

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from sqlalchemy.orm import sessionmaker
  4. from sqlalchemy import create_engine
  5. from models import Users
  6.  
  7. engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5)
    ##############方式一########################
  8. Session = sessionmaker(bind=engine)
  9.  
  10. # 每次执行数据库操作时,都需要创建一个session
  11. session = Session()
  12.  
  13. # ############# 执行ORM操作 #############
  14. obj1 = Users(name="alex1")
  15. session.add(obj1)
  16.  
  17. # 提交事务
  18. session.commit()
  19. # 关闭session
  20. session.close()
  21.  
  22. ######################方式二####################

# 方式二:支持线程安全,为每个线程创建一个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()

  1.  
 多线程执行示例
 基本增删改查示例
 常用操作
 原生SQL语句
 基于relationship操作ForeignKey
 基于relationship操作m2m
 其他

基本增删改查补充

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import time
  4. import threading
  5.  
  6. from sqlalchemy.ext.declarative import declarative_base
  7. from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
  8. from sqlalchemy.orm import sessionmaker, relationship
  9. from sqlalchemy import create_engine
  10. from sqlalchemy.sql import text
  11.  
  12. from db import Users, Hosts
  13.  
  14. engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5)
  15. Session = sessionmaker(bind=engine)
  16.  
  17. session = Session()
  18.  
  19. # ################ 添加 ################
  20. """
  21. obj1 = Users(name="wupeiqi")
  22. session.add(obj1)
  23.  
  24. #批量添加
  25. session.add_all([
  26. Users(name="wupeiqi"),
  27. Users(name="alex"),
  28. Hosts(name="c1.com"),
  29. ])
  30. session.commit()
  31. """
  32.  
  33. # ################ 删除 ################
  34. """
  35. session.query(Users).filter(Users.id > 2).delete()
  36. session.commit()
  37. """
  38. # ################ 修改 ################
  39. """
  40. session.query(Users).filter(Users.id > 0).update({"name" : "099"})
  41. session.query(Users).filter(Users.id > 0).update({Users.name: Users.name + "099"}, synchronize_session=False) #字符串
  42. session.query(Users).filter(Users.id > 0).update({"age": Users.age + 1}, synchronize_session="evaluate") #数字
  43. session.commit()
  44. """
  45. # ################ 查询 ################
  46. """
  47. r1 = session.query(Users).all()
  48. r2 = session.query(Users.name.label('xx'), Users.age).all() #lable #as xx
  49. r3 = session.query(Users).filter(Users.name == "alex").all()
  50. r4 = session.query(Users).filter_by(name='alex').all() #如果里面写条件就用filter_by,和上面filter查询是一回事,只是一种不同的方式
  51. r5 = session.query(Users).filter_by(name='alex').first()
  52. 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来进行格式化
  53. r7 = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all() #上面的这个方式也可以用这一种 ,直接可以进行SQL语句的查询
  54. """
  55.  
  56. session.close()

14 SQLAlchemy的更多相关文章

  1. Flask-论坛开发-3-数据库

    对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 1. SQLAlchemy ...

  2. FlaskWeb开发从入门到放弃(二)

    第5章 章节五 01 内容概要 02 内容回顾 03 面向对象相关补充:metaclass(一) 04 面向对象相关补充:metaclass(二) 05 WTforms实例化流程分析(一) 06 WT ...

  3. 三分钟了解 Python3 的异步 Web 框架 FastAPI

    快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...

  4. 14.python与数据库之mysql:pymysql、sqlalchemy

    相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查 ...

  5. 14、Flask实战第14天:Flask使用SQLAlchemy

    flask-sqlalchemy使用详解 之前我们用到的SQLAchemy是可以单独使用的,不需要用到Flask 如果我们在Flask框架中使用SQLAchemy,可以使用flask_sqlalche ...

  6. Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  7. sqlalchemy(二)高级用法

    sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...

  8. sqlalchemy入门记录

    前言 发现翻译全文时间比较久,所以先整个简单的使用说明吧 安装SQLAlchemy pip install sqlalchemy 查看SQLAlchemy版本 In [1]: import sqlal ...

  9. python之SQLAlchemy

    ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为 ...

随机推荐

  1. kotlin陪伴对象

    在kotlin中并没有静态类成员的概念,但并不等于实现类似于静态类成员的功能,陪伴对象可以解决这个问题 fun main(arg: Array<String>) { val create ...

  2. android设置gps自动开启

    1.第一种方法 private void toggleGPS() { Intent gpsIntent = new Intent(); gpsIntent.setClassName("com ...

  3. 安装完 MySQL 后必须调整的 10 项配置(转)

    当我们被人雇来监测MySQL性能时,人们希望我们能够检视一下MySQL配置然后给出一些提高建议.许多人在事后都非常惊讶,因为我们建议他们仅仅改动几个设置,即使是这里有好几百个配置项.这篇文章的目的在于 ...

  4. MLN Alchemy

    1. 前言: 本文主要参考Alchemy Tutorial, washington主页上挂出的所有Alchemy项目(包括Alchemy1.0, Alchemy2.0, AlchemyLite)都无法 ...

  5. ubuntu 16 搭建只能上传不可下载删除ftp服务

    安装 VSFTPD,(建议使用FileZill测试,报错能看到原因) 如果使用window文件管理连接,要注意下图的设置 使用 apt-get 安装 vsftpd sudo apt-get insta ...

  6. centos安装软件

    rpm指令, 该指令安装文件后缀.rpm的可执行程序 yum指令 安装软件源代码,后缀为 .tar.gz(用gzip压缩过的tar包) rpm rpm软件包格式为 (一)查询系统装已经安装的软件信息 ...

  7. 如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器

    with open('rm_keys.txt', 'r', encoding = 'utf-8') as f: count = 0 for line in f: 7 count += 1 print( ...

  8. Blynk系列随笔

    Blynk系列随笔 1.基于Blynk服务器搭建物联网测试Demo 2.本地 Blynk服务器搭建

  9. SIFT学习笔记之一 下载和调用

     下面给出了多个参考地址,挑个能用的吧: vs2010+Rob Hess SIFT: http://blog.csdn.net/lanbing510/article/details/8507341 R ...

  10. 最新 映客java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.映客等10家互联网公司的校招Offer,因为某些自身原因最终选择了映客.6.7月主要是做系统复习.项目复盘.LeetCode ...