代码之家  ›  专栏  ›  技术社区  ›  Jesse Beder

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

  •  5
  • Jesse Beder  · 技术社区  · 15 年前

    我对Django(和一般的数据库)不熟悉,我不知道如何构造以下内容。我的网站的数据来源是:

    1. 博客
    2. 对于一些不同的游戏:
      • 高分名单
      • 用户创建的级别

    如果我将数据存储在普通文件中,我将只为上面的每一个文件保存一个文件。在Django,理想情况下(我认为)我会为每一个都有一个单独的数据库,但显然,Django还没有多个数据库支持。我担心(不必要地?)将所有内容保存在一个数据库中有两个原因:

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

    2. 当我在其中一个部分工作时,我希望能够自由地轻松地更改模型。自从我学会了 syncdb 事实上,不同步数据库,我已经决定,当处理模型时最简单的事情就是简单地擦除数据库并重新开始。我又担心把其他部分搞得一团糟。我看着 south 在应用程序的规划阶段,这似乎比它的价值更麻烦(但我稍后会重新考虑是否有真正有价值的数据)。

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

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

    4 回复  |  直到 15 年前
        1
  •  9
  •   John Debs    15 年前

    对于它的价值,我完全理解你的挫折,因为我在开始时经历了一个非常相似的思考过程。不幸的是,除了熟悉你将要使用的工具之外,你没有什么可以做的(不管怎样,很容易)。

    首先,您不需要多个数据库来完成您所做的工作—一个数据库可以完成。每个应用程序都将在数据库中创建自己的表,这些表彼此之间有些隔离。正如捷克人所说,你可以 python manage.py reset app_name 重置其中一个,以防您更改模型。不过,您将丢失这些数据。

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

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

        2
  •  4
  •   Frank Wiles    15 年前

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

    虽然我同意South对于您的初始设计/dev阶段来说可能有点重,但对于任何类似于beta版本的东西,以及在生产中绝对必要的东西,都应该认真考虑。

    如果您要在开发过程中处理您的模型,最好的方法是使用fixture在运行sync之后快速加载数据。或者,如果您要更改一组必需的字段,那么可以编写一些快速的python来为您创建虚拟数据。

    至于不相信你的数据是二进制的,一个简单的“pg-dump”会给你一个文本版本的数据。在我看来,你在用你的应用程序对抗实时生产数据,这是一个错误。您的目标应该是让您的应用程序在伪造数据或至少一份生产数据副本上进行构建、工作和测试,然后当您确定一切都是黄金时,将其迁移到生产中。在这里,像South这样的东西可以派上用场,因为您可以自动执行此部署,它将帮助您处理需要进行的任何数据库表/列更改。

    我相信所有这些听起来都是痛苦的,但所有这些都能自动完成,相信我,这会让你的生活更加轻松。

        3
  •  4
  •   czarchaic    15 年前

    我通常只是重置模块

    >>> python manage.py reset blog
    

    这将重置中的所有表 INSTALLED_APPS.blog

    我不确定这是否能回答你的问题,但这比擦掉数据库更具破坏性。

        4
  •  1
  •   Josh Smeaton    15 年前

    同步数据库应该只用于开发。这就是为什么清除表并重新开始并不重要的原因,也许可以将查找数据导出到JSON文件中,每次同步时都可以导入该文件。

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

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