django mysql\base.py 报错 KeyError: class 'bytes'

这次升级了Python版本到了3.6.
但是django2.2的长期支持版本还没稳,所以使用的是1.11的版本,于是写项目就报错了。
然后使用django的时候,makemigrations的时候报错conn.encoders[SafeBytes] = conn.encoders[bytes] KeyError: <class ‘bytes’>。
追踪源码:
问题文件:Python36\lib\site-packages\django\db\backends\mysql\base.py
def get_new_connection(self, conn_params):
conn = Database.connect(**conn_params)
conn.encoders[SafeText] = conn.encoders[six.text_type]
conn.encoders[SafeBytes] = conn.encoders[bytes]
return conn

问题分析
经过百度,发现没有相似的问题。随机谷歌,找到了相关的两个页面:

Django KeyError <class ‘bytes’> in version 1.4.0rc1 · Issue #306 · PyMySQL/mysqlclient-python
new charset definition added by peakkk · Pull Request #591 · PyMySQL/PyMySQL

所以出问题是因为mysqlclient的版本太新了,用pip3 list命令查看,果然我的mysqlclient 的版本是1.4.1 。
解决方案

给MySQLclient降级。先卸载,再安装指定版本。pip3 uninstall mysqlclient,pip3 install mysqlclient==1.3。
我最开始的解决方案,改django的代码(Python36\lib\site-packages\django \db\backends\mysql\base.py),加一个if:

def get_new_connection(self, conn_params):
    conn = Database.connect(**conn_params)
    conn.encoders[SafeText] = conn.encoders[six.text_type]
    # 先判断bytes是否存在于编码器中,如果在才执行操作
    if bytes in conn.encoders:
        conn.encoders[SafeBytes] = conn.encoders[bytes]
    return conn
<think>好的,我需要帮助用户解决Django中出现的“django.db.utils.ProgrammingError: (1146, "Table 'test.django_session' doesn't exist")”错误。首先,我应该回忆一下这个错误通常是什么原因引起的。用户之前问过关于Session的存取操作,可能他们在配置Session后没有创建相应的数据库表。 首先,Django默认使用数据库存储Session,对应的表是django_session。如果用户没有运行迁移命令,这个表就不会被创建,导致访问时出现表不存在的错误。所以第一步应该检查是否执行了迁移,即运行过python manage.py migrate。 接下来,可能需要确认用户是否正确地将'django.contrib.sessions'添加到了INSTALLED_APPS中,因为这会告诉Django需要为Session创建表。如果用户没有添加这个应用,迁移时就不会生成对应的表,从而引发错误。 另外,用户可能在配置中指定了不同的数据库,比如使用了多个数据库配置,而迁移没有应用到正确的数据库上。这时候需要检查settings.py中的DATABASES设置,确认迁移的目标数据库是否正确,是否运行了迁移命令到正确的数据库。 还有一种可能是用户手动删除了数据库表,或者数据库连接有问题,导致迁移未能正确应用。这时候需要检查数据库是否存在,以及用户是否有权限访问该数据库。 总结起来,解决步骤应该是:1. 确认INSTALLED_APPS包含'sessions';2. 运行迁移命令生成django_session表;3. 检查数据库连接配置是否正确;4. 如果使用其他Session引擎,可能需要调整设置,比如换成缓存或文件存储。此外,还需要提醒用户注意数据库权限和手动删除的情况,以及定期清理Session的建议。 需要以用户友好的方式解释这些步骤,并确保用户能一步步操作解决问题。同时,可能还需要给出具体的命令示例,如迁移命令,检查应用配置的方法,以及如何确认数据库连接。最后,可以建议用户如果问题依旧存在,检查错误日志或提供更多信息以便进一步排查。</think>在 Django 中遇到 `django.db.utils.ProgrammingError: (1146, "Table 'test.django_session' doesn't exist")` 错误,通常是因为 **Session 依赖的数据库表 `django_session` 尚未创建**。以下是详细原因和解决方法: --- ### **1. 根本原因** - Django 默认使用数据库存储 Session(依赖 `django_session` 表)。 - 如果未运行数据库迁移(`migrate`),或者迁移未成功应用,该表将不存在。 - 当视图尝试操作 Session 时(如 `request.session['key'] = value`),Django 会查询此表,触发报错。 --- ### **2. 解决步骤** #### **步骤 1:确保启用 Session 应用** 在 `settings.py` 的 `INSTALLED_APPS` 中确认已添加 `django.contrib.sessions`: ```python INSTALLED_APPS = [ # ... 'django.contrib.sessions', # 必须存在 # ... ] ``` #### **步骤 2:执行数据库迁移** 运行以下命令生成 `django_session` 表: ```bash # 生成迁移文件(如果未生成) python manage.py makemigrations # 应用迁移到数据库(关键步骤!) python manage.py migrate ``` #### **步骤 3:验证数据库表是否存在** - 如果使用 MySQL/MariaDB: ```bash mysql -u 用户名 -p USE test; # 进入你的数据库 SHOW TABLES LIKE 'django_session'; # 检查表是否存在 ``` - 如果使用 SQLite: ```bash sqlite3 db.sqlite3 .tables django_session ``` #### **步骤 4:检查数据库配置** 确保 `settings.py` 中的 `DATABASES` 配置正确,且 Django 有权限操作数据库: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 或其他数据库引擎 'NAME': 'test', # 确保数据库名称正确 'USER': '你的用户名', 'PASSWORD': '你的密码', 'HOST': 'localhost', 'PORT': '3306', } } ``` --- ### **3. 其他可能性** #### **(1) 手动删除了数据库表** - 如果表被意外删除,重新运行 `python manage.py migrate --run-syncdb` 重建表。 #### **(2) 使用其他 Session 存储引擎** 如果不想依赖数据库表,可以改用 **缓存(Cache)** 或 **文件(File)** 存储 Session: ```python # settings.py # 使用缓存存储 Session(需配置 CACHES) SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 或使用文件存储 SESSION_ENGINE = 'django.contrib.sessions.backends.file' SESSION_FILE_PATH = '/tmp/django_sessions' # 自定义路径(需读写权限) ``` #### **(3) 迁移冲突或数据库残留** - 尝试删除迁移记录并重新迁移: ```bash # 删除所有应用的迁移文件(谨慎操作!) find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete # 重新生成迁移并应用 python manage.py makemigrations python manage.py migrate ``` --- ### **4. 验证修复** 在视图中添加一个简单的 Session 操作测试: ```python def test_session(request): request.session['test'] = 'Hello, Session!' return HttpResponse("Session 测试成功!") ``` 访问该视图,若不再报错且能正常返回,则说明修复成功。 --- ### **5. 预防措施** 1. **首次部署时务必运行 `migrate`** 新项目或新环境部署时,迁移是必需步骤。 2. **定期清理过期 Session** 通过定时任务运行 `python manage.py clearsessions`,避免表数据膨胀。 3. **检查数据库权限** 确保 Django 使用的数据库用户有创建和修改表的权限。 --- 通过以上步骤,可以彻底解决 `django_session` 表不存在的报错。如果问题依然存在,请检查数据库日志或提供完整的错误堆栈信息以进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值