首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Django会在每次docker-container重启时重新创建DB表?

Django在每次docker-container重启时重新创建DB表的原因是因为它使用了Django的ORM(对象关系映射)机制来管理数据库表的创建和更新。

Django的ORM具有自动检测模型变化并同步到数据库的功能。当Django应用程序启动时,它会检查模型定义的变化,并根据这些变化来自动创建或更新数据库中的表结构。

在Django的项目中,模型(Model)用于定义数据库表的结构和字段。当Django应用程序启动时,它会读取模型的定义,并与数据库中的表进行比较。如果模型中的表在数据库中不存在,Django会自动创建该表。如果模型中的表在数据库中已经存在,但结构发生了变化,Django会自动更新数据库中的表结构以与模型一致。

因此,每次docker-container重启时,Django会重新检查模型的定义,并根据需要自动创建或更新数据库中的表结构。这样可以确保数据库与模型定义保持一致,避免了手动管理数据库表结构的复杂性和错误风险。

对于解决这个问题,可以通过以下几种方式进行优化:

  1. 使用数据迁移工具:Django提供了数据迁移(Migration)机制,它可以帮助我们管理数据库表结构的变化。通过使用数据迁移工具,我们可以在数据库结构变化时手动执行迁移命令,而不是依赖于每次容器重启时的自动同步。这样可以更好地控制数据库表的创建和更新过程。
  2. 持久化数据库:将数据库数据持久化存储,以避免每次容器重启时都重新创建数据库表。可以使用外部数据库服务(如云数据库服务)或将数据库数据存储到持久化存储卷中。这样,在容器重启时,数据库数据不会丢失,可以保持表的状态稳定。
  3. 使用缓存机制:将常用的查询结果缓存起来,以避免每次容器重启时都重新查询数据库。可以使用缓存中间件(如Memcached或Redis)来提高数据访问性能,并减轻数据库的负载。
  4. 使用数据库迁移策略:根据具体情况,可以选择使用不同的数据库迁移策略。例如,可以选择只在开发环境中自动同步数据库表,而在生产环境中手动管理数据库迁移。

综上所述,Django在每次docker-container重启时重新创建DB表是为了确保数据库与模型定义的一致性。可以通过使用数据迁移工具、持久化数据库、使用缓存机制和选择合适的数据库迁移策略来优化这个过程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Django篇(二)

1、创建项目 2、创建应用 3、注册应用 4、修改setting.py来让我们的Django框架支持mysql数据库。...接下来我们重新了解一下有什么其他模型。 首先在使用时,我们需要导入django.db.models包 AutoField: 自动增长的IntegerField,通常不需要我们写,一般会自动生成。...unique:唯一值 db_index:若为True,则会为此字段创建索引。 db_column:指定字段名字,未指定会使用属性名称。 null:若为True,表示该字段允许为空。...我们每次查询的时候都会是模型.objects.xxx。 这个objects是Django帮我们自动生成的管理器对象。通过objects来帮助我们查询信息。...同样我们可以不使用Django帮我们生成的,我们可以自己创建一个。 为什么要自己创建? 1、过滤查询集,比如你查询全部数据,我只让你返回前十条。

1.4K20

Web | Django 与数据库交互,你需要知道的 9 个技巧

希望您使用的是持久的数据库连接,这样每次请求都不会再有连接开销。...比如,同一用户打开另一个选项卡并在第一次尝试「卡住」时再试一次并不罕见。 这就是为什么需要使用限制(Limit)。...外键索引(FK Indexes) 创建模型时,Django 会在所有外键上创建一个 B-Tree 索引,它的开销可能相当大,而且有时候并不很必要。...让我们在创建时添加一个 BRIN 索引: from django.contrib.postgres.indexes import BrinIndex class SomeModel(Model):...创建索引时要考虑的要比索引的大小要多得多。但是现在,通过 Django 1.11 支持索引,我们可以轻松地将新类型的索引整合到我们的应用程序中,使它们更轻,更快。

2.9K40
  • django 1.8 官方文档翻译: 13-9-1 如何使用会话

    Changed in Django 1.8: 删除会话Cookie 是Django 1.8 中的新行为。以前,该行为用于重新生成会话中的值,这个值会在Cookie 中发回给用户。...如果你不想让大家每次打开浏览器时都需要登录时可以这样使用。...如果你想让大家在每次打开浏览器时都需要登录时可以这样使用。...清除存储的会话 随着用户在你的网站上创建新的会话,会话数据可能会在你的会话存储仓库中积累。如果你正在使用数据库作为后端,django_session 数据库表将持续增长。...当一个用户登入时,Django 添加一行到django_session 数据库表中。每次会话数据更新时,Django 将更新这行。如果用户手工登出,Django 将删除这行。

    1.2K20

    teprunner测试平台定时任务这次终于稳了

    页面创建时读取localStorage中的计划信息。 ? 并获取运行环境下拉框选项。 ? 开关按钮的文字是根taskStatus进行设置的。 ? 在保存时,给请求添加上新的这3个参数。...在INSTALLED_APPS中添加django_apscheduler。 接着迁移数据库,创建两张任务表,一张任务明细表,一张任务执行情况表: python manage.py migrate ?...replace_existing设置为True,每次都更新已存在的任务,防止重启服务导致scheduler.add_job()报错。 ? 启动任务。...而MySQL默认8小时会把连接断掉,于是当Django拿着已经被MySQL断开的连接对象去请求MySQL,就报错了。 当我在本地安装了MySQL后,重启MySQL就能复现这个问题。...解决办法二是像Django处理Web请求一样,每次用完就断开,下次使用再重新连接,占用资源少。 猴子补丁是指不修改第三方库的基础上,对库的功能进行扩展。

    1.5K20

    【云原生| Docker】 部署 Django & mysql 项目

    后面的内容都是 app 容器的相关配置: restart :除正常工作外,容器会在任何时候重启,比如遭遇 bug、进程崩溃、docker 重启等情况。...即宿主机当前目录和容器的 /code 目录是连通的,宿主机当前目录的 Django 代码更新时,容器中的 /code 目录中的代码也相应的更新了。...network:只能够访问db_network。添加db容器后记得的修改Django里的数据库设置。...5)生成表&数据迁移 由于我们所配置的数据是空的,此时我们需要生成表和数据迁移 5.1 生成表 进入到sh命令窗口 bash python manage.py migrate 5.2 数据迁移 django...进入mysql终端,设置忽略外键 和 删除 auth_permission 和 django_content_type 表 ( 由于在数据迁移过程中这两个表数据默认生成) set foreign_key_checks

    1.9K20

    Django 1.10中文文档-第一个应用Part2-模型和管理站点

    这些应用,默认包含在Django中,以方便通用场合下使用。 其中一些应用程序使用至少一个数据库表,所以我们需要在数据库中创建表,然后才能使用它们。...你会看到对每次迁移有一条信息。...有了这些代码,Django就能够: 为该应用创建数据库表(CREATE TABLE 语句); 为Question对象和Choice对象创建一个访问数据库的python API。...在处理字段名的引号时也是如此 —— 例如,使用双引号还是单引号; sqlmigrate命令并不会在你的数据库上真正运行迁移文件 —— 它只是把Django 认为需要的SQL打印在屏幕上以让你能够看到...迁移功能非常强大,可以让你在开发过程中不断修改你的模型而不用删除数据库或者表然后再重新生成一个新的 —— 它专注于升级你的数据库且不丢失数据。

    2.3K60

    django的Session-10

    SESSION_ENGINE='django.contrib.sessions.backends.db' 运行 manage.py migrate 命令进行数据库迁移,在数据库内创建sessions表。...因为一旦缓存满了,系统会自动清除部分数据,服务器重启会清除全部数据。 为了保证数据安全,可以使用以下配置项,在储存在缓存的时候,也会在数据库中储存一份,保证数据安全。...SESSION_ENGINE='django.contrib.sessions.backends.cached_db' 储存在本地文件 添加配置项 SESSION_ENGINE='django.contrib.sessions.backends.file...Linux环境下,redis的配置项在 /etc/redis/redis.conf 在 bind 配置项添加地址即可 bind 127.0.0.1 xxx.xxx.xxx.xxx 添加后重启redis服务...如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。

    46540

    Python面试题100例【26~30题】

    以下是Django操作数据库的基本步骤:定义模型:在Django中,每个数据库表由一个Python类来表示,这个类继承自django.db.models.Model。每个类的属性就表示数据库表的字段。...publication_date = models.DateField()迁移:定义好模型之后,需要通过迁移来在数据库中创建对应的表。...每次一个请求被处理,Django首先会根据你的MIDDLEWARE设置来应用每个中间件类的方法。以下是一个使用中间件的基本步骤:创建中间件:中间件是一个Python类,需要实现特定的方法。...二十九、Django开发中如何优化数据库优化查询:使用ORM时,要注意避免生成不必要的查询。...在Django的模型字段中,可以设置db_index=True来创建索引。

    24160

    【Django】 开发:静态文件,应用和模型层

    ' 'django.db.backends.sqlite3' 'django.db.backends.oracle' 'django.db.backends.postgresql' mysql 引擎如下...模型类Models 创建 模型类需继承自 django.db.models.Model Models 的语法规范 from django.db import models class 模型类名(models.Model...2.CharField() 数据库类型:varcha 注意: 必须要指定 max_length 参数值 3.DateField() 数据库类型:date 作用:表示日期 参数: auto_now: 每次保存对象时...允许出现多个字段选项,多个选项之间使用,隔开 primary_key 如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数库表不会创建id字段 blank 设置为True时,字段可以为空...MyModel.objects.create(...) # objects 是管理器对象 创建数据对象 Django 使用一种直观的方式把数据库表中的数据表示成Python 对象 创建数据中每一条记录就是创建一个数据对象

    1.8K20

    Django 2.1.7 Session基本操作,解决 WSGIRequest object has no attribute session 问题

    SESSION_ENGINE='django.contrib.sessions.backends.db' 2)存储在缓存中:存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。...SESSION_ENGINE='django.contrib.sessions.backends.cached_db' 4)如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用...5)迁移后会在数据库中创建出存储Session的表。 其实默认就是设置安装了Session应用。 6)表结构如下图。...答:在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sessionid后,会根据这个值找出这个请求者的Session。...如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。 如果value为None,那么会话永不过期。

    2.6K30

    数据工厂平台-3:首页超链接

    如图,我创建的这个叫DB_links的类,就是一张表,其中俩个参数 名字和url, CharField意思是字段是字符串格式,括号内写的约束,比如最大长度,是否可以为空,是否可以为空字符串。...现在我们已经成功创建了这个超链接的表,那么就去django后台给它增加俩三条数据,以便我们后续开发用。 那么现在的问题是django后台是什么?怎么进?...创建是通过命令创建,命令如下:python3 manage.py createsuperuser 然后我们重启服务 去后台试试登陆: 登陆成功了,我们看到了 用户 和 组 这俩个自带表。...我们点击进入Db_linkss ,现在是0个数据,我们点击右上角按钮,增加一条 创建完后如下: 到此,我们俩条超链接创建成功了。...为什么呢?

    71320

    程序员硬核“年终大扫除”,清理了数据库 70GB 空间

    清除表中的Bloat 就像在索引中一样,表也可能包含死元组,可能会导致碎片化。与包含关联表中数据的索引不同,不能仅简单地重新创建表。...要重新创建表,必须创建一个新表,迁移数据,同步数据,在其他表中创建所有索引……等完成这操作后,才能将旧表切换为新表。...有几种方法可以重建表: 重新创建表:如上所述,使用这种方法通常需要大量的开发工作,尤其是在重建正在使用表的情况下。...Django ORM迁移 为了将上述技术与Django一起使用,需要注意几件事: 防止隐式创建外键索引 除非明确设置db_index=False,否则Django会在models.ForeignKeyfield...我们没有显式设置db_index,因此Django将在该字段上隐式创建完整索引。

    2.2K10

    让 Django 完成翻译:迁移数据库

    我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。...迁移数据库 为了让 Django 完成翻译,创建好这些数据库表,我们再一次请出我的工程管理助手 manage.py。...不过此时还只是告诉了 Django 我们做了哪些改变,为了让 Django 真正地为我们创建数据库表,接下来又执行了 python manage.py migrate 命令。...Django 翻译后的数据库表创建语句,这有助于你理解 Django ORM 的工作机制。...和创建数据库表一样,Django 为这些操作提供了一整套方法,从而把我们从数据库语言中解放出来。

    1.2K90

    Django教程 —— 模型类详解

    : 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 Django 会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后...定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下: 属性 = models.字段类型(选项) 模型类的字段类型 使用时需要引入django.db.models 包 from django.db...参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。...db_column 字段的名称,如果未指定,则使用属性的名称。 db_index 若值为True, 则在表中会为此字段创建索引,默认值是False。 default 默认值。...当修改模型类之后,如果添加的选项不影响表的结构,则不需要重新做迁移,属性的选项中 default 和blank 不影响表结构。

    1.7K20
    领券