You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django连接额外配置数据库时如何指定cursor_factory获取自定义游标

实现方案

方案1:调用Django封装的cursor方法(推荐)

Django 数据库连接对象的cursor()方法本身就会自动处理连接初始化逻辑,不需要手动判断连接状态、手动调用connect()。针对PostgreSQL后端,你可以直接向cursor()方法传递cursor_factory参数,示例代码如下:

from psycopg2.extras import NamedTupleCursor
from django.db import connections

with connections["db"].cursor(cursor_factory=NamedTupleCursor) as cursor:
    # 执行数据库操作
    cursor.execute("SELECT * FROM your_table")
    results = cursor.fetchall()
    # 每一行结果都是NamedTuple对象,可直接通过属性名访问字段

这种写法完全符合Django的设计规范,上下文管理器退出时会自动关闭游标,连接也由Django的连接池统一管理,不需要手动处理连接关闭逻辑,Django会在请求生命周期结束或超过CONN_MAX_AGE配置时自动回收闲置连接。

方案2:全局配置游标工厂(适合所有查询都需要用NamedTupleCursor的场景)

如果你希望该数据库连接的所有游标默认都是NamedTupleCursor,可以直接在settings.py的数据库配置中添加OPTIONS参数指定:

DATABASES = {
    "db": {
        "ENGINE": "django.db.backends.postgresql",
        # 其他常规配置:NAME、USER、PASSWORD、HOST、PORT等
        "OPTIONS": {
            "cursor_factory": "psycopg2.extras.NamedTupleCursor",
        },
    }
}

配置后不需要每次获取游标时额外传参,正常调用即可:

from django.db import connections

with connections["db"].cursor() as cursor:
    # 此处获取的默认就是NamedTupleCursor
    ...

连接生命周期说明

你担心的连接无法正常关闭的问题不会出现:

  • Web请求场景下,Django会自动在请求处理完成后关闭超过CONN_MAX_AGE的闲置连接
  • 脚本、异步任务等非请求场景,可以在所有数据库操作完成后调用close_old_connections()手动清理闲置连接:
from django.db import close_old_connections

# 所有数据库操作结束后执行
close_old_connections()

内容的提问来源于stack exchange,提问作者LondonRob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:06:00