使用 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
,'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
,'138***'
,'bachelor'
,'single',0
))
sqlalchemy 支援一次插入多行,需要插入的資料放在 list 中:
def
test_insert_multiple_rows
(self)
:with engine.connect(
)as conn:
values =[(
'9004'
,'stone4'
,'wang'
,'m',20
,'138***'
,'bachelor'
,'single',0
),('9005'
,'stone5'
,'wang'
,'m',20
,'138***'
,'bachelor'
,'single',0
),('9006'
,'stone6'
,'wang'
,'m',20
,'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
,'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...