Django怎么接数据库_settings中DATABASES配置MySQL/PostgreSQL

最常见的失败是PORT写成字符串或漏掉ENGINE;ENGINE必须为'django.db.backends.mysql',PORT必须是整数3306;本地HOST用'127.0.0.1'而非'localhost';PyMySQL需在__init__.py中patch;环境变量缺省值勿设空字符串。

MySQL 连接配置写错端口或引擎会直接报 OperationalError

最常见的失败不是密码错,而是 PORT 写成字符串(比如 '3306')或者漏掉 ENGINE。Django 默认用 django.db.backends.sqlite3,不显式指定 MySQL 引擎就会连 SQLite,但表结构建不起来,后面 migrate 时才爆 OperationalError: (1045, "Access denied...")(2003, "Can't connect to MySQL server")

  • ENGINE 必须是 'django.db.backends.mysql'(注意不是 mysqldbpymysql
  • PORT 必须是整数,3306,不能加引号
  • 如果用 mysqlclient(推荐),确保已装: pip install mysqlclient;用 PyMySQL 需在 __init__.py 中 patch(见下一条)
  • 本地开发常用 HOST'127.0.0.1',别写 'localhost' —— MySQL 对这两者解析不同,'localhost' 会走 socket,容易连不上

PostgreSQL 的 NAMEUSER 必须真实存在,且权限要开

Django 不创建数据库、不建用户,它只连。所以 NAME 填的是库名,不是文件路径;USER 是 PostgreSQL 里的角色(role),不是系统用户名。连不上时大概率是:psql -U postgres 能进,但 psql -U your_user -d your_dbpassword authentication faileddatabase "xxx" does not exist

  • NAME 必须是已用 createdb your_db 创建好的库名
  • USER 必须已用 createuser -P your_user 创建,并赋予 CREATEDB 权限(migrate 需要)
  • PASSWORD 是该用户的密码,不是系统密码,也不是 pg_hba.conf 里设的认证方式
  • 默认 PORT5432,别漏;HOST 如果是本地,填 '127.0.0.1''localhost' 更稳

用 PyMySQL 代替 mysqlclient 时,必须在 __init__.py 里 import 并 monkey patch

因为 mysqlclient 是 C 扩展,PyMySQL 是纯 Python 实现,Django 默认不认识它。不 patch 就算 ENGINE 写对了,启动时也会报 ModuleNotFoundError: No module named 'MySQLdb' —— Django 底层还是在找 MySQLdb

OpenPerplex

OpenPerplex是一个开源的AI搜索引擎,致力于整合多种信息源,为用户提供智能精准的搜索体验。

  • 在项目根目录的 __init__.py(不是 settings.py)中加两行:
  • import pymysql
    pymysql.install_as_MySQLdb()
  • 确保已装 pymysqlpip install PyMySQL
  • 仅限开发或轻量场景用 PyMySQL;生产环境强烈建议用 mysqlclient,性能和稳定性差一截

DATABASES 里混用环境变量时,os.getenv() 缺省值别设空字符串

很多人用 os.getenv('DB_NAME', ''),结果 NAME 变成空串,Django 会试图连一个叫 '' 的库,报 OperationalError: database "" does not exist。更糟的是,有些环境变量没配全,但代码没报错,直到 migrate 或 runserver 才崩。

  • os.getenv('DB_NAME') 不带默认值,让它返回 None,然后显式检查:
  • 例如:NAME = os.getenv('DB_NAME') or 'myproject_dev'
  • 密码字段尤其不能设空默认值,否则连空密码库,安全风险
  • 推荐用 django-environ 管理,但哪怕不用,也至少用 assert 卡住关键字段:assert os.getenv('DB_PASSWORD'), 'DB_PASSWORD required'

环境变量没配全、引擎写错、端口类型不对、数据库/用户实际不存在——这四类问题占了 Django 数据库连不上原因的八成。真正卡住人的往往不是语法,而是“以为配对了,其实某个字段根本没生效”。

相关推荐: