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
-
創建引擎
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)
-
構建元數據
# 元數據: 主要是指數據庫表結構、關聯等信息 # 實例化MetaData(從引擎讀取元數據) meta = MetaData(bind=engine)
-
獲取表
tb_user = Table('tb_user', meta, autoload=True, autoload_with=engine)
-
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()
-
銷毀引擎
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
-
創建引擎
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)
-
構建元數據
# 元數據: 主要是指數據庫表結構、關聯等信息 # 實例化MetaData(從引擎讀取元數據) meta = MetaData(bind=engine)
-
獲取表
tb_user = Table('tb_user', meta, autoload=True, autoload_with=engine)
-
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()
-
顯示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
-
銷毀引擎
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
-
創建引擎
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)
-
構建元數據
# 元數據: 主要是指數據庫表結構、關聯等信息 # 實例化MetaData(從引擎讀取元數據) meta = MetaData(bind=engine)
-
獲取表
tb_user = Table('tb_user', meta, autoload=True, autoload_with=engine)
-
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()
-
銷毀引擎
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
-
創建引擎
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)
-
構建元數據
# 元數據: 主要是指數據庫表結構、關聯等信息 # 實例化MetaData(從引擎讀取元數據) meta = MetaData(bind=engine)
-
獲取表
tb_user = Table('tb_user', meta, autoload=True, autoload_with=engine)
-
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()
-
銷毀引擎
engine.dispose()