如何查看sqlalchemy执行的原始sql语句?

SQLAlchemy打开SQL语句方法如下,echo=true将开启该功能:

engine = create_engine("<db_rul>", echo=True)

Flask-SQLAlchemy打开SQL方法如下:

app.config["SQLALCHEMY_ECHO"] = True

 

转载于:https://www.cnblogs.com/shengulong/p/8385791.html

<think>在Flask-SQLAlchemy中,默认的查询返回的是模型对象列表,而不是字典。如果我们想要返回字典格式,有几种方法可以实现。其中一种方法是使用SQLAlchemy的`result`对象,它可以将查询结果转换为字典。另一种方法是直接使用SQLAlchemy Core的`text`函数执行原始SQL,并设置返回格式为字典。但更常见的是使用ORM的特性,将查询结果转换为字典。 这里我将展示两种方法: 1. 使用ORM查询并转换为字典(通过遍历查询结果并调用模型的`to_dict`方法,或者使用列表推导式和模型对象的`__dict__`属性,但注意`__dict__`会包含一些内部属性,需要过滤)。 2. 使用`db.session.execute`执行原始SQL,并获取字典格式的结果(通过设置`dict_row`或者使用`mappings()`方法,取决于SQLAlchemy版本)。 由于Flask-SQLAlchemy基于SQLAlchemy,我们可以使用SQLAlchemy的`ResultProxy`的`mappings`方法(在SQLAlchemy 1.4及以上版本中,可以使用`mappings()`)来返回字典。 我将分别展示这两种方法: 方法一:使用ORM查询并转换为字典 我们可以为模型添加一个`to_dict`方法,这样在查询后可以方便地将每个对象转换为字典。 方法二:使用原始SQL查询并返回字典 我们可以使用`db.session.execute`执行原始SQL,然后通过调用结果集的`mappings()`方法(在SQLAlchemy 1.4及以上版本中)来获取字典列表。 注意:在较旧的SQLAlchemy版本中(如1.3及以下),可以使用`dicts`选项,但新版本推荐使用`mappings`。 下面分别给出示例代码: 假设我们有一个模型`User`: 首先,我们为模型添加一个`to_dict`方法(方法一):</think>### 使用 Flask-SQLAlchemy 返回字典格式的查询结果 在 Flask-SQLAlchemy 中,默认查询返回的是模型对象列表。要实现字典格式返回,主要有以下三种方法: #### 方法一:使用 `mappings()` 方法(推荐) ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app) # 定义数据模型 class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) email = db.Column(db.String(120)) # 查询并返回字典列表 def get_users_dict(): # 使用 mappings() 获取字典格式结果 result = db.session.execute(db.select(User)).mappings().all() # 转换结果 dict_list = [] for row in result: # 直接获取字典格式的 row dict_list.append(dict(row)) return dict_list ``` **代码解释:** 1. `db.session.execute(db.select(User))` 执行 SQL 查询 2. `.mappings()` 方法使结果以字典形式返回 3. `.all()` 获取所有结果 4. 遍历结果并使用 `dict(row)` 转换为标准字典 #### 方法二:添加 `to_dict()` 方法到模型 ```python class User(db.Model): # ... 同上模型定义 ... def to_dict(self): return { 'id': self.id, 'name': self.name, 'email': self.email } # 查询使用 def get_users_dict(): users = User.query.all() return [user.to_dict() for user in users] ``` **代码解释:** 1. 在模型类中添加 `to_dict()` 方法定义输出格式 2. 查询后遍历结果列表,对每个对象调用 `to_dict()` #### 方法三:使用 SQLAlchemy Core 的 `table` 对象 ```python def get_users_dict(): # 获取表对象 users_table = User.__table__ # 执行查询 query = db.session.query(users_table).select_from(User) result = query.all() # 转换为字典列表 dict_list = [] for row in result: dict_list.append({column.name: getattr(row, column.name) for column in users_table.columns}) return dict_list ``` **代码解释:** 1. `User.__table__` 获取底层表对象 2. 使用 `db.session.query(users_table)` 执行查询 3. 遍历结果时通过表列名动态构建字典 ### 使用示例 ```python @app.route('/users') def users(): users_data = get_users_dict() # 获取字典列表 return {'users': users_data} ``` ### 方法对比 | 方法 | 优点 | 缺点 | |--------------|-------------------------------|--------------------------| | `mappings()` | 官方推荐,无需修改模型 | SQLAlchemy 1.4+ 版本要求 | | `to_dict()` | 灵活控制输出字段 | 需修改模型类 | | SQLAlchemy Core | 不依赖 ORM 模型 | 代码较复杂 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值