SQLAlchemy 執行語句的列印

2021-08-28 02:10:58 字數 2346 閱讀 3348

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

方式一:

sqlalchemy支援在建立資料庫引擎時,通過echo=true,將連線這個資料庫引擎的所有執行語句列印出來:

engine = create_engine("", echo=true)

官網說明: 

這種方式會自動將連線資料庫過程中的所有型別語句,以及這些語句的引數列表列印出來。也即是說,這種方式列印出的語句和語句中的引數是分離的。

方式二:

query = session.query(model).filter(*query_cond).order_by(order_info)

對於某乙個像上邊這樣的查詢或插入語句,可以直接通過下邊的方式,列印出不包含引數的sql語句

print str(query)

這種方式得到的sql也不可直接執行,因為對應的引數變數沒有被替換

方式三from sqlalchemy.dialects import mysql

print str(query.statement.compile(dialect=mysql.dialect(), compile_kwargs=))

這種方式可以列印包含引數的執行語句,但是引數只包括數字和字串等基本型別。其中dialects表示需要的資料庫方言,我這裡用的mysql。

基於方式三,增加部分**,來列印datetime等型別的引數。

from sqlalchemy.orm import query

from datetime import date, timedelta

def render_query(statement, dialect=none):

query = session.query(model).filter(*query_cond)

print render_query(query)

result = query.all()

"""if isinstance(statement, query):

if dialect is none:

dialect = statement.session.bind.dialect

statement = statement.statement

elif dialect is none:

dialect = statement.bind.dialect

class literalcompiler(dialect.statement_compiler):

def visit_bindparam(self, bindparam, within_columns_clause=false,

literal_binds=false, **kwargs):

return self.render_literal_value(bindparam.value, bindparam.type)

def render_array_value(self, val, item_type):

if isinstance(val, list):

return "" % ",".join([self.render_array_value(x, item_type) for x in val])

return self.render_literal_value(val, item_type)

def render_literal_value(self, value, type_):

if isinstance(value, long):

return str(value)

elif isinstance(value, (basestring, date, datetime.datetime, timedelta)):

return "'%s'" % str(value).replace("'", "''")

elif isinstance(value, list):

return "''" % (",".join([self.render_array_value(x, type_.item_type) for x in value]))

return super(literalcompiler, self).render_literal_value(value, type_)

return literalcompiler(dialect, statement).process(statement)

上邊的**支援 sqa 1.0.13及以上版本,支援select、insert和update命令。對其他版本的情況,可以參考

參考:

SQLAlchemy 執行原生 SQL語句

使用 sqlalchemy 一般通過 session 物件 orm 方式運算元據庫。如果需要通過 原生 sql 語句運算元據庫,就需要跟 engine 和 connect 物件打交道。engine 物件包含資料庫連線池和資料庫方言,通過 create engine 函式來建立,engine 物件的 ...

SqlAlchemy 常用查詢器和執行器

過濾器 說明filter 把過濾器新增到原查詢上,返回乙個新查詢 filter by 把等值過濾器新增到原查詢上,返回乙個新查詢 limit 使用指定的值限定原查詢返回的結果 offset 偏移原查詢返回的結果,返回乙個新查詢 order by 根據指定條件對原查詢結果進行排序,返回乙個新查詢 gr...

mysql 語句在哪執行 MySQL語句執行過程

平常我們看到的只是一條語句執行出來的結果,並不知道中間發生了什麼,今天就來 一下,mysql語句的執行過程。1.聯結器 每次使用mysql會先連線到資料庫上面,聯結器負責跟客戶端進行連線 mysql u root p 然後根據密碼,判斷我登陸進去會有什麼許可權,並分配許可權給我 通過 show pr...