14 SQLAlchemy
2024-09-03 16:03:53
一. 介绍
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. 创建数据库表
创建单表
创建多个表并包含Fk、M2M关系
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()
多线程执行示例
基本增删改查示例
常用操作
原生SQL语句
基于relationship操作ForeignKey
基于relationship操作m2m
其他
基本增删改查补充
#!/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()
最新文章
- 初识AngularJS 之 HelloWorld和数据绑定
- hibernate基础之无法自动创建表总结
- VI命令----用于检索
- Java条件语句 switch case
- Spring(二)——IoC
- lodash中_.set的用法
- Nginx-动态路由升级版
- phpstudy中的mysql
- python中线程和进程(一)
- Unity3D判断当前所在平台
- java----判断闰年和平年
- 关于git的一些命令
- linux常见系统调用函数列表
- 使用kubebapps 管理helm 仓库已经应用使用Monocular专门提供helm 仓库查找
- JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
- Sword redis C语言接口介绍
- Jungle Roads---poj1251 hdu1301
- Linux 安装、启动和卸载SSH
- Spark分析之SparkContext启动过程分析
- 使用过Memcache缓存吗?如果使用过,能够简单描述下其工作原理吗?
热门文章
- linux之i2c子系统维护者源码仓库地址
- code review 20190705
- 模型压缩-L1-norm based channel pruning(Pruning Filters for Efficient ConvNets)
- PAT 甲级 1012 The Best Rank (25 分)(结构体排序)
- PHPCMS get SQL 返回单条的办法
- [Graphics] UIColor created with component values far outside the expected range, Set a breakpoint on UIColorBreakForOutOfRangeColorComponents to debug. This message will only be logged once.
- 【ARTS】01_28_左耳听风-201900520~201900526
- xampp 启动mysql 显示busy
- swift 第十一课 结构体定义model类
- unity3d 嵌入iOS的 In App Purchase 应用程序内购买