SQLAlchemy 是一个 ORM框架:类对应表,类中的字段对应表中的列,类的对象对应表的一条记录;作用:帮助我们使用类和对象快速实现数据库操作
操作数据库的方式:
1. 原生SQL - pymysql :支持 python2 和 python3 - MySQLdb :只支持 python2 2. ORM框架 :框架本身要是有ORM应用自己的(如 Django),要是没有就用 SQLAlchemy
安装 SQLAlchemy:
pip install sqlalchemy
注: SQLAlchemy 默认不能修改表结构;想修改表结构需要引入第三方组件
SQLAlchemy 单表
创建数据库的表 --- 单表:models.py
import datetime from sqlalchemy import create_engine # 引入 创建引擎 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index # 引入列和数据类型 Base = declarative_base() # Base 要自己实例化 class Users(Base): # Users是类名;类 继承 Base __tablename__ = 'users' # 数据库的表名叫 "users" id = Column(Integer, primary_key=True) # Colume表示列; id 是表中的列,Interger 表示整形,primary_key=True 表示 是主键 name = Column(String(32), index=True, nullable=False) # name 为表中的列, String(32) 表示 MySQL中的 Varchar(32), index=True 表示索引,nullable=False 表示不允许为空 # email = Column(String(32), unique=True) # ctime = Column(DateTime, default=datetime.datetime.now) # extra = Column(Text, nullable=True) def init_db(): """ 根据类创建数据库的表 :return: """ engine = create_engine( # 创建数据库连接 "mysql+pymysql://root:[email protected]:3306/dbtest?charset=utf8", # mysql 表示要连接的数据库;pymysql 表示用 pymysql 来连接;用户名是 root,密码是123,连接本地的 dbtest 这个数据库 max_overflow=0, # 超过连接池大小外最多创建的连接;即超过 pool_size 后最多能溢出多少个连接 pool_size=5, # 连接池大小 pool_timeout=10, # 池中没有线程(连接)最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置);-1表示不重建 ) Base.metadata.create_all(engine) # Base.metadata.create_all() : 找到当前 py 文件下面 继承了Base的所有的类,在数据库中生成一张表 def drop_db(): """ 根据类删除数据库中的表 :return: """ engine = create_engine( "mysql+pymysql://root:[email protected]:3306/dbtest?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) Base.metadata.drop_all(engine) # Base.metadata.drop_all() : 找到当前 py 文件下面 继承了Base的所有的类,在数据库中删除相应的表 if __name__ == "__main__": init_db() # drop_db()
单表基本增删改查示例:crud.py
from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from models import Users # 导入 Users 类 # 创建数据库连接(crud 这个py文件的数据库连接) engine = create_engine("mysql+pymysql://root:[email protected]:3306/dbtest", max_overflow=0, pool_size=5) Session = sessionmaker(bind=engine) # Session可理解成 连接池 # 通过 SQLAlchemy 操作数据库:通过 Users 类对 users 表进行增删改查 # 每次执行数据库操作时,都需要创建一个session (可理解成一个连接) session = Session() # ############# 执行ORM操作:增 ############# # 1. 单条增加 """ obj1 = Users(name="neo") # 实例化一个 Users 的对象;该对象是在内存中创建 session.add(obj1) # session 根据 obj1 在表中增加一条数据 session.commit() # session.add() 之后要 commit() 一下 session.close() # 关闭 连接 """ # 2. 多条增加 """ obj2 = Users(name="egon") obj3 = Users(name="alex") session.add_all( # 增加多个;也可以 session.add() 多次 [obj2,obj3] # 添加的记录(对象)放入 列表 中 ) session.commit() session.close() """ # ############# 执行ORM操作:查 ############# # 1. 查询所有 res = session.query(Users).all() # 查询 Users 表中的所有数据 print(res) # 打印结果(按id 倒序排列): [<models.Users object at 0x000002132AEFE400>, <models.Users object at 0x000002132AEFE470>, <models.Users object at 0x000002132AEFE4E0>] for row in res: print(row.id, row.name) # 2. 条件查询 res_filter = session.query(Users).filter(Users.id >= 2) # filter() 中直接加 表达式 for row in res_filter: print(row.id, row.name) # 3. 只取第一个 res_first = session.query(Users).filter(Users.id >= 2).first() # first() 取到的结果不再是一个列表,而是一个对象 print(res_first.id, res_first.name) # ############# 执行ORM操作:删 ############# session.query(Users).filter(Users.id >= 3).delete() # 查询结果 .delete() session.commit() # 删除之后也要 commit() # ############# 执行ORM操作:改 ############# session.query(Users).filter(Users.id == 1).update({Users.name: "NEO"}) # 查询结果.update({ }) # session.query(Users).filter(Users.id==1).update({"name":"neo"}) # 也可以用这种写法 session.commit() # update() 补充: # session.query(Users).filter(Users.id > 0).update({Users.name: Users.name + "099"}, synchronize_session=False) # 在字段原有值的基础上更新时,synchronize_session=False 表示是 字符串 的拼接 # session.query(Users).filter(Users.id > 0).update({"age": Users.age + 1}, synchronize_session="evaluate") # 在字段原有值的基础上更新时,synchronize_session="evaluate" 表示是 数值 的相加减 # session.commit() session.close()