SQLAlchemy 執行原生 SQL語句

2021-10-20 03:28:12 字數 3309 閱讀 7898

使用 sqlalchemy ,一般通過 session 物件 orm 方式運算元據庫。如果需要通過 原生 sql 語句運算元據庫,就需要跟 engine 和 connect 物件打交道。

engine 物件包含資料庫連線池和資料庫方言,通過 create_engine() 函式來建立,engine 物件的 connect() 方法返回 connection 物件,connection 物件提供 execute() 方法,允許通過原生 sql 語句來運算元據庫。

本篇以 sqlite 資料庫為例,簡單介紹原生 sql 操作的一些要點。

示例:

from sqlalchemy import create_engine

engine = create_engine(

'sqlite:/'

)def

test_select_statement()

:with engine.connect(

)as conn:

result_proxy = conn.execute(

"select * from employees"

)# 返回值為resultproxy型別

result = result_proxy.fetchall(

)for item in result:

print

(item)

sqlalchemy 支援兩種格式的 sql 語句:?和 :number。

def

test_parameter_method1()

:with engine.connect(

)as conn:

conn.execute(

"""insert into employees

(emp_id, first_name, last_name, gender,

age, email, phone_nr,education,

marital_stat, nr_of_children)

values (?,?,?,?,?,?,?,?,?,?);

""",(

'9002'

,'stone2'

,'wang'

,'m',20

,'[email protected]'

,'138***'

,'bachelor'

,'single',0

))

方法 2 :

def

test_parameter_method2()

:with engine.connect(

)as conn:

conn.execute(

"""insert into employees

(emp_id, first_name, last_name, gender,

age, email, phone_nr, education,

marital_stat, nr_of_children)

values (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10);

""",(

'9003'

,'stone3'

,'wang'

,'m',20

,'[email protected]'

,'138***'

,'bachelor'

,'single',0

))

sqlalchemy 支援一次插入多行,需要插入的資料放在 list 中:

def

test_insert_multiple_rows

(self)

:with engine.connect(

)as conn:

values =[(

'9004'

,'stone4'

,'wang'

,'m',20

,'[email protected]'

,'138***'

,'bachelor'

,'single',0

),('9005'

,'stone5'

,'wang'

,'m',20

,'[email protected]'

,'138***'

,'bachelor'

,'single',0

),('9006'

,'stone6'

,'wang'

,'m',20

,'[email protected]'

,'138***'

,'bachelor'

,'single',0

)]conn.execute(

"""insert into employees

(emp_id, first_name, last_name, gender,

age, email, phone_nr, education,

marital_stat, nr_of_children)

values (?,?,?,?,?,?,?,?,?,?);

""", values)

由於執行 sql 插入操作自動提交 (commit),sqlalchemy 提供了 transactions 來管理 commit 和 rollback,需要提交的時候用 commit() 方法,需要回滾的時候用 rollback() 方法。

def

test_txn

(self)

: conn = engine.connect(

)with conn.begin(

)as txn:

conn.execute(

"""insert into employees

(emp_id, first_name, last_name, gender, age, email, phone_nr,

education, marital_stat, nr_of_children)

values (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10);

""",(

'9007'

,'stone7'

,'wang'

,'m',20

,'[email protected]'

,'138***'

,'bachelor'

,'single',0

))txn.commit(

) conn.close(

)

github - executing raw sql statement

sqlalchemy 這原生sql中繫結list

這專案中有在一定範圍內進行更新的要求,所以直接使用sqlalchemy執行sql語句進行更新,但是發現list無法繫結到引數上。stack overflow上查詢到了解決方案,將list轉成tuple才能進行繫結 示例 id list 1,2,3 sql text update test set n...

SQLAlchemy 執行語句的列印

最近需要分析業務 中mysql語句執行效率,對於直接顯示執行sql語句的地方,可以直接將sql語句和引數拼接後的結果列印出來,但是對於用sqlalchemy query查詢的地方,就需要想辦法列印出最後實際執行的語句。找了下各種方案,最後結果如下 方式一 sqlalchemy支援在建立資料庫引擎時,...

Django執行原生SQL

hey,各位小夥伴,這次怎麼來玩一下,如何使用django執行原生sql 我們都知道,python在web界的扛把子,django,可謂是集大成為統一,各種各樣的外掛程式,forms元件,model模型,admin後台 反正就是乙個字,nb 本次就來學一下,如何在django執行原生語句 在使用dj...