SQLAlchemy(1):SQLAlchemy基本的增删改查

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()

猜你喜欢

转载自www.cnblogs.com/neozheng/p/10301692.html
今日推荐