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:root@127.0.0.1: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:root@127.0.0.1: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:root@127.0.0.1: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:root@127.0.0.1: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()
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM