"Django documentation"说"ensure that Django has permission to create and alter tables"那么如何在postgreSQ



我正在学习使用RubyonRails和python的EdX类。这让我有勇气尝试使用Apach、mod_wsgi和PostgreSQL安装和学习Django。按照详细的安装说明,我首先安装了Apache,然后是mod_wsgi,然后是PostgreSQL。我从源代码安装了每一个,并对每一个都进行了一点教程,确保它们安装正确。我有一个postgres用户设置来运行PostgreSQL服务器,我可以为自己创建一个用户"角色",也可以为我的角色继承一个管理员角色来创建数据库等。我在psql中尝试了一些SQL,遵循了制作表等的教程。我知道如何为给定的角色授予权限。

无论如何,我已经非常接近从源代码安装Django的步骤,但我不确定如何遵循安装说明中的建议:

如果您计划使用Django的manage.py-syncdb命令为您的模型自动创建数据库表,您需要确保Django有权在您使用的数据库中创建和更改表;如果您计划手动创建表,您可以简单地授予Django SELECT、INSERT、UPDATE和DELETE权限。

也许在我按照实际安装Django的步骤并完成一些教程之后,我会确切地了解需要在PostgreSQL中设置什么才能授予Django这些权限,但如果我按照安装说明的顺序进行操作,这似乎是在说我应该在安装Djano之前先设置这些权限。如果我能在安装Django之前让人告诉我如何在这里完成,我将不胜感激。

在django项目的settings.py文件中,有一个片段显示如下内容:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproj_db',
'USER': 'myproj_user',
'PASSWORD': '123',
'HOST': '',
'PORT': '',
},
}

这样做的目的是,它告诉Django什么用户(在本例中是postgres用户)和数据库与您的Django项目一起使用。

通常,您需要将此myproj_usermyproj_db一起创建。

当你创建这个用户时,你可以选择给它权限,如下所示:

CREATE USER myproj_user WITH PASSWORD '123' SUPERUSER CREATEDB CREATEROLE LOGIN;

这将创建具有超级用户、createdbm-createrole、允许用户登录权限的myproj_user

然后数据库是这样的:

CREATE DATABASE myproj_db WITH OWNER myproj_user TEMPLATE=template1 ENCODING='utf-8';

你说你知道如何为给定的角色授予特权,这是你在安装Django(运行syncdb)之前需要为它做的。

这是设置数据库以供Django使用的一部分,这是在创建每个Django项目之前要执行的步骤。每个Django项目对应于您使用Django构建的一个站点,并且与另一个Django工程完全分离。每个项目都有一个数据库。*你可以在设置数据库之前安装Django这个框架,因为Django框架本身不会做任何事情。

要么您授予Django为您创建表的权限,在这种情况下,它可以为您创建表格(使用manage.py syncdb)。或者,您可以使用manage.py sqlall <app>来获取SQL,您可以自己运行该SQL来创建所需的表(如果您对安全性有顾虑,这可能会很好)。

要将Postgres中特定数据库(选项1)的所有权限授予用户,请使用以下命令(来自psql):

GRANT ALL PRIVILEGES ON DATABASE <db-name> TO <username>;

*从技术上讲,他们可以通过简单地将数据库配置为使用同一个数据库来共享数据库

Django使用ORM(对象关系映射器)。这意味着,您不直接处理用于查询事物的数据库表,而是处理某些类,然后这些类处理数据库。这比手动执行SQL非常有用,而且用户友好得多。考虑以下示例:
SELECT * FROM foo WHERE field="value"

Foo.objects.filter(field='value')

在ORM中,您通过创建某些类来描述您所拥有的表(在Django中,我们称它们为模型),这些模型对应于数据库中的表,它们的字段对应于数据库表中的列。以下内容非常相似:

CREATE TABLE foo (
title        varchar(50),
description  text,
likes        integer
);

class Foo(models.Model):
title = models.CharField(max_length=50)
description = models.TextField()
likes = models.IntegerField()

然而,作为一名开发人员,构建用于创建表的SQL语句并将这些表描述为模型是浪费时间的。并非如此,Django允许您在定义所有模型后,为您创建数据库表。这就是syncdb命令的用途。它获取所有安装的应用程序和其中的模型,并在数据库中为它们创建表。但是,正如您在问题中已经提到的,数据库具有角色,这些角色具有权限。例如,其中一个权限是CREATE,如本文所述。因此,Django文档所说的是,您可以授予Django将用于与数据库交互的角色所有必要的权限,以便Django能够创建所需的数据库表,并可能在以后对其进行修改。

相关内容

  • 没有找到相关文章

最新更新