How to fix error: django.db.utils.NotSupportedError: URIs not supported

本文详细记录了一个在使用Django框架时遇到的SQLite3数据库启动异常问题及其解决方案。问题表现为启动时出现NotSupportedError错误,通过修改源代码中的uri参数设置,成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题呢,很操蛋,半个下午都在弄这个花里胡哨的问题,国内的博客,没看到有正面解决问题的,写的东西也不全,话都是一半一半的说。

看了一部分帖子,给了大概的想法,下面让我们来看一下这个问题的回答和具体的代码。

一、question:

 The above exception was the direct cause of the following exception:

  Traceback (most recent call last):
  File "/tech/poc/env/lib/python3.5/site-packages/django/utils/autoreload.py", line 228, in wrapper
    fn(*args, **kwargs)
  File "/tech/poc/env/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 128, in inner_run
    self.check_migrations()
  File "/tech/poc/env/lib/python3.5/site-packages/django/core/management/base.py", line 422, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/migrations/executor.py", line 20, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/migrations/loader.py", line 52, in __init__
    self.build_graph()
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/migrations/loader.py", line 209, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/migrations/recorder.py", line 65, in applied_migrations
    self.ensure_schema()
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/migrations/recorder.py", line 52, in ensure_schema
    if self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor()):
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/backends/base/base.py", line 254, in cursor
    return self._cursor()
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/backends/base/base.py", line 229, in _cursor
    self.ensure_connection()
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/backends/base/base.py", line 213, in ensure_connection
    self.connect()
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/tech/poc/env/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/backends/base/base.py", line 213, in ensure_connection
    self.connect()
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/backends/base/base.py", line 189, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/tech/poc/env/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 198, in get_new_connection
    conn = Database.connect(**conn_params)
django.db.utils.NotSupportedError: URIs not supported

二、answer:I have the same problem, it's broke on my machine, but all my co-workers don't get the bug. I debugged in django's code, and found that in django.db.backends.sqlite3.base on about line 194 it sets uri True. If i comment that out, it works.

这个answer没有直面说解决方法,说了问题的出现在哪里,就是在这个base.py的大概194行左右,有个True。这里出了问题。

但是并没有告诉你怎么修改这里的代码。

三、solution:原因分析,这是sqlite3版本3.7的通病,安装3.8的就可以,这里我采用修改源码的方式,直接打开。

"/home/python3/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py"这个文件,修改修改大概198行,通过搜索uri查找。
# between multiple threads. The safe-guarding will be handled at a
        # higher level by the `BaseDatabaseWrapper.allow_thread_sharing`
        # property. This is necessary as the shareability is disabled by
        # default in pysqlite and it cannot be changed once a connection is
        # opened.
        if 'check_same_thread' in kwargs and kwargs['check_same_thread']:
            warnings.warn(
                'The `check_same_thread` option was provided and set to '
                'True. It will be overridden with False. Use the '
                '`DatabaseWrapper.allow_thread_sharing` property instead '
                'for controlling thread shareability.',
                RuntimeWarning
            )
        kwargs.update({'check_same_thread': False})
        if self.features.can_share_in_memory_db:
            kwargs.update({'uri': False})  #这里原来是True,修改为False就可以了
        return kwargs

把上面的uri对应True修改为False就ok了。

后面那个error就无伤大雅了,能启动就ok了,换一波端口就ok。

四、附加安装3.8的方法

1. wget http://www.sqlite.org/2015/sqlite-autoconf-3081101.tar.gz 

2.tar -xvzf sqlite-autoconf-3081101.tar.gz 

3.编译安装:

  (1)./configure

  (2)make

  (3)sudo make install

  (4)sudo ldconfig          

4.检查一波

这个结果的话:起飞了解下。

我觉得我这篇博客写的很详细了,如果想要转发一波的,请把在下的链接地址贴一波,不胜荣幸。

这里大家可能会有一些疑问,怎么前面3.5后面3.6,我的问题解决了。之前的问题那些报错也找不到了,就随便找了别人犯的同类错误error粘了上去,大家理解流程就好,细节嘛,自己的问题得到解决就ok。

### 解决方案概述 当遇到 `django.db.utils.NotSupportedError: MySQL 8.0.11 or later is required (found 5.7.18)` 错误时,这表明当前安装的 MySQL 数据库版本低于 Django 所需的最低支持版本。以下是几种可能的解决方案。 --- ### 升级 MySQL 到兼容版本 最推荐的方法是将 MySQL 升级至 8.0.11 或更高版本。这样可以确保 Django 和数据库之间的完全兼容性。具体操作步骤如下: 1. **下载并安装最新版 MySQL** 访问 [MySQL 官方网站](https://dev.mysql.com/downloads/mysql/) 下载适合的操作系统对应的安装包,并按照官方文档完成安装过程[^1]。 2. **验证 MySQL 版本** 使用命令行工具确认已成功升级到目标版本: ```bash mysql --version ``` 3. **更新 Django 的数据库配置** 如果升级过程中更改了任何连接参数(如端口或用户名/密码),记得同步调整项目的 `settings.py` 文件中的数据库配置部分。 --- ### 修改 Django 源码以绕过版本检查 如果暂时无法升级 MySQL,则可以通过修改 Django 源代码来跳过版本检测逻辑。需要注意的是,这种方法可能会带来潜在的风险,因为它允许使用不受支持的功能组合。 #### 方法一:注释掉版本校验函数调用 定位到项目虚拟环境中 `base.py` 文件路径下的 `init_connection_state()` 函数定义处,在大约第 239 行附近找到下面这一句并将它注释掉: ```python self.check_database_version_supported() ``` 完成后保存文件重新启动应用服务即可生效[^4]。 #### 方法二:自定义覆盖默认行为 另一种更优雅的方式是在应用程序根目录创建一个新的模块比如命名为 `hexception.py` ,然后重写 `check_database_version_supported` 方法实现警告而非抛异常处理机制[^3]: ```python def check_database_version_supported(self): """ 自定义方法用于替代原生版本检查功能, 当前环境仅打印提示信息而不中断程序运行。 """ if ( self.features.minimum_database_version is not None and self.get_database_version() < self.features.minimum_database_version ): db_ver = ".".join(map(str, self.get_database_version())) min_ver = ".".join(map(str, self.features.minimum_database_version)) print( f"WARNNING : Current MySQL Version ({db_ver}) " f"is lower than recommended minimum ({min_ver})." ) ``` 接着通过适当方式引入此定制化组件替换原有类成员属性指向新定义的行为实例对象。 --- ### 替代数据库引擎选项 考虑更换成其他受支持的关系型数据库管理系统作为后台存储层也是一个可行的选择之一。例如 PostgreSQL 是一种非常流行且强大的开源关系数据库软件,通常被推荐用来搭配 Python Web 应用框架一起部署生产环境当中去使用。 切换流程大致包括以下几个方面的工作内容但不限于这些要点列表项列举出来供参考学习借鉴之用而已哦~ 😊 - 更新依赖库名称从 PyMySQL 改为 psycopg2; - 调整 DATABASES 字典结构字段值对应新的驱动器类型字符串表示形式; - 导入迁移脚本转换现有数据表模式结构适应目标平台特性差异之处等等…… --- ### 总结 综上所述,针对该问题存在三种主要应对策略可供选择实施尝试解决问题所在根源原因分析清楚之后再做决定采取行动措施最为稳妥可靠安全有效率高效率高质量标准执行下去就不会轻易失败啦!😊 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值