【问题标题】:Changed DB engine to MySQL. Now Django does not create tables将数据库引擎更改为 MySQL。现在 Django 不创建表
【发布时间】:2020-06-29 18:00:16
【问题描述】:

我有一个带有标准 sqlite3 数据库的 Django 应用程序。现在我想使用 MySQL。所以我把我的DATABASES改成了settings.py,效果很好,但是我不能运行服务器,因为它说

django.db.utils.InternalError: (1049, "Unknown database 'django'")

所以我在客户端创建了这个数据库,现在它说

django.db.utils.ProgrammingError: (1146, "Table 'django.Cat' doesn't exist")

似乎我必须自己创建所有表格,这是我能做的最糟糕的变体。

#settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/path/to/db.conf',
        },
    }
}

#conf.db
[client]
database = django
host = localhost
user = DjangoUser
password = password_you_cant_guess
default-character-set = utf8

如何让 Django 创建我拥有的所有表?

我什至不能用任何命令运行python3 manage.py,因为它给了我这个例外。

追溯:

Traceback (most recent call last):
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 74, in execute
    return self.cursor.execute(query, args)
  File "/path/to/project/venv/lib/python3.6/site-packages/MySQLdb/cursors.py", line 209, in execute
    res = self._query(query)
  File "/path/to/project/venv/lib/python3.6/site-packages/MySQLdb/cursors.py", line 315, in _query
    db.query(q)
  File "/path/to/project/venv/lib/python3.6/site-packages/MySQLdb/connections.py", line 239, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.ProgrammingError: (1146, "Table 'django.Cat' doesn't exist")

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

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/path/to/project/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 377, in execute
    django.setup()
  File "/path/to/project/venv/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/apps/registry.py", line 122, in populate
    app_config.ready()
  File "/path/to/project/External/apps.py", line 13, in ready
    active_cats = list(Cat.objects.filter(active_cat=True).all())
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/models/query.py", line 276, in __iter__
    self._fetch_all()
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/models/query.py", line 1261, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/models/query.py", line 57, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1151, in execute_sql
    cursor.execute(sql, params)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/path/to/project/venv/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 74, in execute
    return self.cursor.execute(query, args)
  File "/path/to/project/venv/lib/python3.6/site-packages/MySQLdb/cursors.py", line 209, in execute
    res = self._query(query)
  File "/path/to/project/venv/lib/python3.6/site-packages/MySQLdb/cursors.py", line 315, in _query
    db.query(q)
  File "/path/to/project/venv/lib/python3.6/site-packages/MySQLdb/connections.py", line 239, in query
    _mysql.connection.query(self, query)
django.db.utils.ProgrammingError: (1146, "Table 'django.Cat' doesn't exist")

【问题讨论】:

  • 您是否在 MySQL 实例中创建了数据库 django?除非您创建它,否则它不存在。见dev.mysql.com/doc/refman/8.0/en/creating-database.html
  • @BillKarwin,是的,我做到了。正如我在问题中所说,我创建了它,然后我得到了django.db.utils.ProgrammingError: (1146, "Table 'django.Cat' doesn't exist")。我真的必须创建所有表吗?
  • 您必须在各自的数据库引擎中创建数据库。 Django 不会这样做
  • @ArakkalAbu,请阅读我写的评论 :)
  • 你不需要创建,但是数据库

标签: python mysql django migration django-database


【解决方案1】:

你的问题在这里:

File "/path/to/project/External/apps.py", line 13, in ready
    active_cats = list(Cat.objects.filter(active_cat=True).all())

此代码作为初始化过程的一部分执行。这就是阻止您执行任何管理命令的原因。注意this is documented with a very clear warning:

警告

虽然您可以如上所述访问模型类,但避免 在您的 ready() 实现中与数据库交互。这 包括执行查询的模型方法(save()、delete()、manager 方法等),以及通过 django.db.connection 进行的原始 SQL 查询。您的 ready() 方法将在每个管理命令启动期间运行。 例如,即使测试数据库配置是分开的 从生产设置中,manage.py test 仍然会执行一些 针对生产数据库的查询!

【讨论】:

  • 嗯,你是对的,但有两个问题: 1. 为什么它与 sqlite 一起工作? 2.我需要在服务器开始运行之前对db进行一些更改,那么,我该怎么办而不是你发现的问题? :)
  • 1/ 因为您在运行迁移创建表后添加了此代码(提示:定期检查您是否可以在新的空数据库上运行所有迁移是一件好事)。
  • 2/“服务器启动”没有多大意义——在生产中,Django 应用程序通常作为多个并发进程运行,这些进程由前端服务器 wsgi 桥(apache mod_wsgi、gunicorn 或其他)处理.实际上,如果不确切知道您想在这里做什么以及为什么要回答这个问题是不可能的(当心xy problems)。
  • 我曾经在Flask app 中做过类似的事情。我的应用程序运行其他一些脚本,它们可以持续很长时间,所以如果服务器由于某种原因崩溃,我需要在下一次服务器启动时将它们标记为失败。这个变体在Flask 中是可以的,但似乎在那里不起作用
  • 你可能想要使用异步任务队列——你的“其他脚本”不应该依赖于 wsgi 服务器进程的生命周期。但是再一次,如果没有明确的问题陈述(=> 在新问题中),就不可能提供任何认真的帮助。 “ir 在 Flask 上运行良好”这一事实(实际上我会说“到目前为止似乎运行良好”——在您的应用程序以一些真实的流量和负载投入生产之前,很多事情似乎都运行良好)并没有意味着无论如何这是最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
相关资源
最近更新 更多