SQLAlchemy 增、删、该、查

SQLAlchemy-03-1

Table(表)类方式 - Insert

# 导入引擎创建函数
from sqlalchemy import create_engine
# 导入语句处理函数
from sqlalchemy.sql.expression import text

# 导入元数据、表类
from sqlalchemy import MetaData, Table
# 导入数据类型
from sqlalchemy import Integer, String, Text, DateTime
# 导入列类和关联
from sqlalchemy import Column, ForeignKey
  1. 创建引擎

    uri = 'mysql+pymysql://root:[email protected]:3306/user_system?charset=utf8'
    # create_engine()有一个关键字参数echo, 表示是否输出debug信息,默认为False
    engine = create_engine(uri, echo=True)
    
  2. 构建元数据

    # 元数据: 主要是指数据库表结构、关联等信息
    # 实例化MetaData(从引擎读取元数据)
    meta = MetaData(bind=engine)
    
  3. 获取表

    tb_user = Table('tb_user', meta, autoload=True, autoload_with=engine)
    
  4. Insert

    # 构造查询表达式(带有值)
    ins = tb_user.insert().values(username='ruirui', password='123456')
    print(str(ins))
    # 查看参数
    print(ins.compile().params)
    # 查看SQL
    print(ins.compile().string)
    
    # 创建连接
    conn = engine.connect()
    
    # 执行insert操作
    result = conn.execute(ins)
    # 如果是insert操作
    if result.is_insert:
        # 获取新添加的记录的主键
        print(result.inserted_primary_key)
    
    # 构造查询表达式(不带值)
    ins = tb_user.insert()
    print(str(ins))
    
    # 插入单条数据
    result = conn.execute(ins, username='aaron', password='hillel')
    
    # 插入多条数据
    data = [
        {'username': 'swartz', 'password' : '1234567'},
        {'username': 'gates', 'password' : '3456789'},
        {'username': 'bill', 'password' : '111222333'}
    ]
    result = conn.execute(ins, data)
    # 显示新增的条数
    print(result.rowcount)
    
    # 关闭连接
    conn.close()
    
  5. 销毁引擎

    engine.dispose()
    

SQLAlchemy-03-2

Table(表)类方式 - Delete

# 导入引擎创建函数
from sqlalchemy import create_engine
# 导入语句处理函数
from sqlalchemy.sql.expression import text

# 导入元数据、表类
from sqlalchemy import MetaData, Table
# 导入数据类型
from sqlalchemy import Integer, String, Text, DateTime
# 导入列类和关联
from sqlalchemy import Column, ForeignKey
  1. 创建引擎

    uri = 'mysql+pymysql://root:[email protected]:3306/user_system?charset=utf8'
    # create_engine()有一个关键字参数echo, 表示是否输出debug信息,默认为False
    engine = create_engine(uri, echo=True)
    
  2. 构建元数据

    # 元数据: 主要是指数据库表结构、关联等信息
    # 实例化MetaData(从引擎读取元数据)
    meta = MetaData(bind=engine)
    
  3. 获取表

    tb_user = Table('tb_user', meta, autoload=True, autoload_with=engine)
    
  4. Delete

    # 构造删除表达式(无条件)
    dlt = tb_user.delete()
    print(str(dlt))
    
    # 构造删除表达式(带条件: id >= 10)
    dlt = tb_user.delete().where(
        tb_user.columns['id'] >= 10
    )
    print(str(dlt))
    
    # 构造删除表达式(带条件: password以1开头)
    dlt = tb_user.delete().where(
        tb_user.columns['password'].startswith('1')
    )
    print(str(dlt))
    
    # 构造删除表达式(带多个条件: password包含3但是不包含9,且id<10)
    dlt = tb_user.delete().where(
        tb_user.columns['password'].like('%3%')
    ).where(
        tb_user.columns['password'].notlike('%9%')
    ).where(
        tb_user.columns['id'] < 10
    )
    print(str(dlt))
    
    # 创建连接
    conn = engine.connect()
    
    # 执行delete操作
    result = conn.execute(dlt)
    
    # 显示删除的条数
    print(result.rowcount)
    
    # 关闭连接
    conn.close()
    
  5. 显示SQL语句

    def structure_sql(sql_str_or_stmt, dialect_obj=None, sql_params=None, return_obj=False):
        '''
        构造SQL语句
        参数:
            sql_str_or_stmt: 原始(Raw)SQL字符串或Statement(Select、Insert、Update、Delete)对象
            dialect_obj: 数据库专用术语对象
            sql_params: 参数
            return_obj: 是否返回编译对象(默认否,返回字符串)
        refer: https://stackoverflow.com/questions/5631078/sqlalchemy-print-the-actual-query#answer-45551136
        '''
        stmt = sql_str_or_stmt
        # 如果是原始字符串,则包装成 Statement 对象
        if isinstance(stmt, str):
            stmt = text(stmt)
        
        if bool(sql_params):
            # Insert、Delete、Update和Select本身带有参数,无需额外参数绑定,没有bindparams()方法
            if hasattr(stmt, 'bindparams'):
                stmt = stmt.bindparams(**sql_params)
    
        # 获取数据库专业术语
        if dialect_obj is None:
            # 如果没有指定,则从语句绑定的引擎中获取
            if bool(stmt.bind):
                dialect_obj = stmt.bind.dialect
            else:
                # 如果没有指定,也没有绑定引擎,则抛出错误
                raise ValueError('参数 [dialect_obj] 未指定')
    
        # 编译语句
        full_sql = stmt.compile(
            dialect=dialect_obj,
            compile_kwargs={"literal_binds": True}
        )
        return full_sql if return_obj else full_sql.string
    
  6. 销毁引擎

    engine.dispose()
    

SQLAlchemy-03-3

Table(表)类方式 - Update

# 导入引擎创建函数
from sqlalchemy import create_engine
# 导入语句处理函数
from sqlalchemy.sql.expression import text

# 导入元数据、表类
from sqlalchemy import MetaData, Table
# 导入数据类型
from sqlalchemy import Integer, String, Text, DateTime
# 导入列类和关联
from sqlalchemy import Column, ForeignKey
  1. 创建引擎

    uri = 'mysql+pymysql://root:[email protected]:3306/user_system?charset=utf8'
    # create_engine()有一个关键字参数echo, 表示是否输出debug信息,默认为False
    engine = create_engine(uri, echo=True)
    
  2. 构建元数据

    # 元数据: 主要是指数据库表结构、关联等信息
    # 实例化MetaData(从引擎读取元数据)
    meta = MetaData(bind=engine)
    
  3. 获取表

    tb_user = Table('tb_user', meta, autoload=True, autoload_with=engine)
    
  4. Update

    # 构造更新表达式(无条件)
    upt = tb_user.update()
    print(str(upt))
    
    # 构造更新表达式(带条件: 8 <= id <= 9)
    upt_nd = tb_user.update().where(
        tb_user.columns.id.between(8, 9)
    )
    print(str(upt_nd))
    
    # 构造更新表达式(带值)
    upt = tb_user.update().values(username='新来的')
    print(str(upt))
    upt = tb_user.update().values(username='Python', password='py666789')
    print(str(upt))
    
    # 构造更新表达式(带条件和值)(可以用多个where)
    new_data = {
        'username': 'new数据',
        'password': '123456'
    }
    upt = tb_user.update().where(
        tb_user.columns['id'] > 10
    ).values(**new_data)
    print(str(upt))
    
    # 创建连接
    conn = engine.connect()
    
    # 执行update操作(对于带值的Update)
    result = conn.execute(upt)
    
    # 执行update操作(没有带值的Update)
    result = conn.execute(upt_nd, password='6ge654321')
    
    # 显示更新的条数
    print(result.rowcount)
    
    # 关闭连接
    conn.close()
    
  5. 销毁引擎

    engine.dispose()
    

SQLAlchemy-03-4

Table(表)类方式 - Select

# 导入引擎创建函数
from sqlalchemy import create_engine
# 导入语句处理函数
from sqlalchemy.sql.expression import text

# 导入元数据、表类
from sqlalchemy import MetaData, Table
# 导入数据类型
from sqlalchemy import Integer, String, Text, DateTime
# 导入列类和关联
from sqlalchemy import Column, ForeignKey
  1. 创建引擎

    uri = 'mysql+pymysql://root:[email protected]:3306/user_system?charset=utf8'
    # create_engine()有一个关键字参数echo, 表示是否输出debug信息,默认为False
    engine = create_engine(uri, echo=True)
    
  2. 构建元数据

    # 元数据: 主要是指数据库表结构、关联等信息
    # 实例化MetaData(从引擎读取元数据)
    meta = MetaData(bind=engine)
    
  3. 获取表

    tb_user = Table('tb_user', meta, autoload=True, autoload_with=engine)
    
  4. Select

    # 构造查询表达式(无条件)
    sel = tb_user.select()
    print(str(sel))
    
    # 构造查询表达式(带条件: 8 <= id <= 9)
    sel = tb_user.select().where(
        tb_user.columns.id.between(8, 9)
    )
    print(str(sel))
    
    # 创建连接
    conn = engine.connect()
    
    # 执行select操作
    result = conn.execute(sel)
    
    # 是否返回了结果
    if result.returns_rows:
        # 取一条
        print(result.fetchone())
        print(result.closed)
        # 取N条
        N = 2
        print(result.fetchmany(N))
        # 取剩余的所有条
        print(result.fetchall())
    
        # 关闭结果游标
        result.close()
    
    # 执行select操作
    result = conn.execute(sel)
    
    # 取第一条(first()方法自动关闭游标)
    print(result.first())
    print(result.closed)
    
    # 关闭连接
    conn.close()
    
  5. 销毁引擎

    engine.dispose()
    

猜你喜欢

转载自www.cnblogs.com/cp9648/p/10415738.html
今日推荐