Database 如何使用多个不同的应用程序在Django中组织数据库?

Database 如何使用多个不同的应用程序在Django中组织数据库?,database,django,Database,Django,我对Django(以及一般的数据库)是新手,我不知道如何构造以下内容。我将为我的网站提供的数据来源如下: 博客 对于一些不同的游戏: 高分表 用户创建的级别 如果我将数据存储在普通文件中,我只需要为上面的每个文件存储一个文件。在Django中,理想情况下(我认为)我应该为每一个都有一个单独的数据库,但显然Django还没有多个数据库支持。我担心(不必要地?)将所有内容保存在一个数据库中,原因有二: 如果我把其中一个部分搞砸了,我不想把其余的数据搞砸 当我在其中一个部分工作时,我希望能够轻松地

我对Django(以及一般的数据库)是新手,我不知道如何构造以下内容。我将为我的网站提供的数据来源如下:

  • 博客
  • 对于一些不同的游戏:
    • 高分表
    • 用户创建的级别
  • 如果我将数据存储在普通文件中,我只需要为上面的每个文件存储一个文件。在Django中,理想情况下(我认为)我应该为每一个都有一个单独的数据库,但显然Django还没有多个数据库支持。我担心(不必要地?)将所有内容保存在一个数据库中,原因有二:

  • 如果我把其中一个部分搞砸了,我不想把其余的数据搞砸

  • 当我在其中一个部分工作时,我希望能够轻松地改变模型。由于我了解到
    syncdb
    实际上并不同步数据库,因此我决定在与模型混淆时,最简单的方法是简单地擦除数据库并重新开始。再一次,我担心把其他部分搞乱。我看了一下,在一个应用程序的规划阶段,它似乎比它的价值要麻烦得多(但当有真正有价值的数据时,我会重新考虑)

  • 问题的一部分在于,我不太习惯将数据保存为二进制格式。我习惯于文本,所以我可以很容易地区分它,在编辑器中修改它,等等,而不需要通过一些神奇的数据库界面(顺便说一下,我使用的是postgresql)


    我的担心是没有根据的吗?人们通常如何处理这个问题?

    Syncdb实际上应该只用于开发。这就是为什么擦除表并重新开始并不重要的原因,可能是将查找数据导出到json文件中,您可以在每次同步时导入该文件

    然而,当您的站点投入生产时,您还有一些工作要做。您对模型所做的任何更改都需要反映在数据库中,需要作为SQL发出并在数据库上手动运行。有一个django-admin.py函数来发出建议的SQL,您可以使用它构建一个脚本,在数据库上运行以迁移它。正如您所提到的,像South这样的迁移应用程序在这里可能是有益的,但它不是严格需要的


    就站点分离而言,将它们作为单独的站点/项目运行。每个项目可以有一个单独的设置文件,允许您运行两个不同的数据库。这与在同一个项目中将两个站点作为单独的应用程序运行形成对比。如果它们完全分开,它们可能不应该在同一个项目中,除非您需要利用公共代码。

    简而言之,您的担心是没有根据的。您应该按项目“组织”数据库,以使用Django术语。每个应用程序中的每个模型都有自己的表,但它们都位于同一个数据库中。将它们放在一个单独的数据库中不是一个好主意,原因有很多,最大的原因是您无法跨数据库查询

    虽然我同意south对于您的初始设计/开发阶段来说可能有点沉重,但对于任何类似于beta版的产品,都应该认真考虑,并且在生产中是绝对必要的

    如果你在开发过程中要把模型弄得一团糟,最好的办法就是在运行sync之后使用fixture快速加载数据。或者,如果要更改一组必填字段,则编写一些快速Python来为您创建虚拟数据

    至于不相信你的数据是二进制的,一个简单的“pg_转储”会得到你的数据的文本版本。在我听来,你在根据实时生产数据开发应用程序,这是一个错误。您的目标应该是让您的应用程序在假数据或至少生产数据的副本上构建、运行和测试,然后在确定一切正常后将其迁移到生产环境中。这就是像south这样的东西派上用场的地方,因为您可以自动化此部署,它将帮助您处理需要进行的任何数据库表/列更改


    我相信所有这些听起来都很痛苦,但所有这些都可以自动化,相信我,这会让你的生活更轻松

    我通常只是重置模块

    >>> python manage.py reset blog
    
    这将重置
    INSTALLED\u APPS.blog中的所有表


    我不确定这是否回答了你的问题,但这比擦数据库破坏性小得多。

    不管它值多少钱,我完全理解你的沮丧,因为我在开始时经历了一个非常类似的思考过程。不幸的是,除了熟悉将要使用的工具之外,你没有什么可以做的(无论如何,很容易)

    首先,您所做的事情不需要多个数据库,一个数据库就可以了。每个应用程序都将在数据库中创建自己的表,这些表彼此之间有些隔离。正如Czarchic所提到的,您可以执行
    python manage.py reset app_name
    ,以便在更改模型时只重置其中一个。但是,您将丢失这些数据

    要以相对易于使用的格式获取数据,可以使用命令
    python manage.py dumpdata>file_name.json
    ,然后在以后重新加载
    python manage.py loaddata file_name.json
    。您可以将其用于备份、本地测试数据或作为穷人的迁移(提示:南方将更容易)


    另一种选择是对任何您认为需要额外灵活性的数据使用NoSQL数据库。请记住,Django目前不支持任何这些。这意味着没有管理支持或模型表单。当然,拥有一个模型可能是不必要的。

    如果有大量的通用代码,它总是可以分解成一个模块/一组模块,由所有相关的Django项目导入。只要确保安排好事情,使共享代码模块从Djang的角度来看位于Python路径上