跳转至

结果处理

获取结果数据

fetch_one() - 获取单条记录

result = await engine.execute("SELECT * FROM users WHERE id = %s", (1,))
user = await result.fetch_one()
if user:
    print(user)

fetch_many() - 获取多条记录

result = await engine.execute("SELECT * FROM users")
users = await result.fetch_many(10)  # 获取 10 条记录
for user in users:
    print(user)

fetch_all() - 获取所有记录

result = await engine.execute("SELECT * FROM users")
all_users = await result.fetch_all()
print(f"共 {len(all_users)} 条记录")

iterate() - 异步迭代器

result = await engine.execute("SELECT * FROM users")
async for user in result.iterate():
    print(user)

直接迭代 Result

# 方式一:直接迭代 execute 返回的结果
async for user in engine.execute("SELECT * FROM users"):
    print(user)

# 方式二:先 await 再迭代
result = await engine.execute("SELECT * FROM users")
async for user in result:
    print(user)

结果类型

默认 tuple 类型

result = await engine.execute("SELECT id, name, email FROM users")
user = await result.fetch_one()
# user 是 tuple: (1, "张三", "zhangsan@example.com")

dict 类型

result = await engine.execute(
    "SELECT id, name, email FROM users",
    result_class=dict
)
user = await result.fetch_one()
# user 是 dict: {"id": 1, "name": "张三", "email": "zhangsan@example.com"}

自定义模型类型

from pydantic import BaseModel
from asmysql import Engine

class User(BaseModel):
    id: int
    name: str
    email: str

engine = Engine(url="mysql://root:pass@127.0.0.1:3306/")
await engine.connect()

result = await engine.execute(
    "SELECT id, name, email FROM users",
    result_class=User
)
user = await result.fetch_one()
# user 是 User 实例
print(user.name)  # 使用属性访问

错误处理

检查错误

result = await engine.execute("SELECT * FROM non_existent_table")
if result.error:
    print(f"错误码: {result.error_no}")
    print(f"错误信息: {result.error_msg}")
    print(f"错误对象: {result.error}")
else:
    data = await result.fetch_all()

错误属性

  • result.error:错误异常对象(MySQLErrorNone
  • result.error_no:错误码(整数,无错误时为 0)
  • result.error_msg:错误信息(字符串,无错误时为空字符串)

执行统计信息

result = await engine.execute("INSERT INTO users (name) VALUES (%s)", ("张三",))

# 受影响的行数
print(f"受影响行数: {result.row_count}")

# 最后插入的 ID(仅 INSERT 语句)
print(f"最后插入 ID: {result.last_rowid}")

# 当前游标位置
print(f"游标位置: {result.row_number}")

注意: - row_count 在流式查询(stream=True)时返回 None - row_count 在发生错误时返回 None - last_rowid 仅在 INSERT 语句时有效