SQLALchemy是Python中的一款优秀的ORM框架,它可以作用于任何第三方Web框架,如flask,tornado等框架。
SQLALchemy相较于DjangoORM来说更加的贴近原生SQL语句,因此学习难度较低。
组成部分 描述
Engine 框架引擎
Connection Pooling 数据库链接池
Dialect 数据库DB API种类
Schema/Types 架构&类型
SQL Exprression Language SQL表达式语言
下载SQLALchemy模块:
pip install sqlalchemy值得注意的是SQLALchemy必须依赖其他操纵数据的模块,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...] 更多: 表操作SQLALchemy中不允许修改表结构,如果修改表结构则需要删除旧表,再创建新表:
#!/usr/bin/env python # -*- coding:utf-8 -*- import datetime from sqlalchemy import Column, Integer, String, DateTime, UniqueConstraint, Index from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base # 基础类 Base = declarative_base() # 创建引擎 engine = create_engine( "mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8", # "mysql+pymysql://root:123@127.0.0.1:3306/db1?charset=utf8", # 有密码时 max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(32), index=True, nullable=False) age = Column(Integer,nullable=False) phone = Column(String(11)) addr = Column(String(64), nullable=True) create_time = Column(DateTime, default=datetime.datetime.now) # 一定不要加括号 __table_args__ = ( UniqueConstraint("id", "name"), # 创建联合唯一 可指定name给个别名 Index("phone", "addr", unique=True), # 创建联合唯一索引 可指定name给个别名 ) def __str__(self): return "object:<id:%s name:%s>" % (self.id, self.name) def create_tb(): """ 创建表 :return: """ Base.metadata.create_all(engine) def drop_tb(): """ 删除表 :return: """ Base.metadata.drop_all(engine) if __name__ == '__main__': drop_tb() create_tb() 链接库表创建好之后,开始链接库。
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import scoped_session # 导入引擎,模型表等 from models import * # 通过Session绑定引擎和数据库建立关系 Session = sessionmaker(bind=engine) # 创建链接池,使用session即可为当前线程拿出一个链接对象。内部采用threading.local进行隔离 session = scoped_session(Session) 单表记录 新增记录新增单条记录:
from sqlalchemy.orm import scoped_session from sqlalchemy.orm import sessionmaker # 导入引擎,模型表等 from models import * # 通过Session绑定引擎和数据库建立关系 Session = sessionmaker(bind=engine) # 创建链接池,使用session即可为当前线程拿出一个链接对象。内部采用threading.local进行隔离 session = scoped_session(Session) user_obj = Users(name="user001", phone="15125352333",age=23, addr="China") session.add(user_obj) # 提交 session.commit() # 关闭链接 session.close() 修改记录修改记录:
from sqlalchemy.orm import scoped_session from sqlalchemy.orm import sessionmaker # 导入引擎,模型表等 from models import * # 通过Session绑定引擎和数据库建立关系 Session = sessionmaker(bind=engine) # 创建链接池,使用session即可为当前线程拿出一个链接对象。内部采用threading.local进行隔离 session = scoped_session(Session) # 修改名字 session.query(Users).filter_by(id=1).update({"name": "USER001"}) # 修改年龄,使用+号,默认为"fetch",代表只允许int类型使用+号 session.query(Users).filter_by(id=1).update({"age": Users.age + 1},synchronize_session="fetch") # 修改地址,使用+号,由于是字符类型,所以要修改synchronize_session=False session.query(Users).filter_by(id=1).update({"addr":Users.addr + "BeiJing"},synchronize_session=False) # 提交 session.commit() # 关闭链接 session.close() 删除记录