“Django文档”中提到“确保Django有创建和修改表的权限”,那么我该如何在postgreSQL中实现呢?

8
我正在参加使用Ruby on Rails和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这些权限,但如果我按照顺序遵循安装说明,似乎建议我在安装Django之前设置这些权限。如果我能在此处得到有关如何在安装Django之前进行设置的指导,我将不胜感激。
3个回答

11
在 Django 项目的 settings.py 文件中,有一个片段大致如下:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproj_db',
        'USER': 'myproj_user',
        'PASSWORD': '123',
        'HOST': '',
        'PORT': '',
    },
}

这是告诉Django项目使用哪个用户(在此例中为postgres用户)和数据库的设置。通常,您需要一起创建myproj_usermyproj_db

创建该用户时,您可以选择授予其以下权限:

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

这将创建一个名为myproj_user的用户,并允许他拥有超级用户、创建数据库、创建角色和登录的权限。

然后再创建数据库:

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


1
谢谢。这是对我的问题的直接回答。在给予SUPERUSER权限之后,真的有必要进一步指定权限吗?此外,Django应该成为超级用户吗? - Colin Keenan
不确定为什么我的一些评论没有显示出来。希望这不会重复出现。我想感谢您还展示了正确设置“ENGINE”的方式,因为当我按照settings.py中的注释进行设置时,它会导致一个关于找不到模块的错误。 - Colin Keenan
没问题!很高兴你觉得有帮助。某些数据库级别的操作需要额外的权限。例如,COPY FROM 命令需要用户具有 SUPERUSER 权限。因此,所需的权限取决于您的要求。您肯定需要 LOGIN 权限,因为这决定了用户是否能够对数据库进行身份验证和登录。CREATE USER 实际上假定了 LOGIN,所以我不需要在我的 SQL 语句中加入它。 - super9

0

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

这是设置与 Django 一起使用的数据库的一部分 - 在创建每个 Django 项目之前进行的步骤。每个 Django 项目对应于您使用 Django 构建的站点,并且与另一个 Django 项目完全独立。每个项目都有一个数据库。* 您可以在设置数据库之前安装 Django 框架,因为 Django 框架本身不会执行任何操作。

要么您授予 Django 创建表的权限,这样它就可以为您创建表(使用 manage.py syncdb)。要么,您使用 manage.py sqlall <app> 获取 SQL,然后自己运行以创建所需的表格(如果您对安全性很担心,这可能很好)。

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

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

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


我不理解的是Django用户是什么?我只需在psql中设置一个角色供Django使用,随便叫什么就可以了吗?然后,我该如何告诉Django那个角色的名称是什么? - Colin Keenan

0
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语句并在Python中描述这些表的模型是一种浪费时间的做法。为了避免这种情况,Django允许您定义所有模型后,自动为您创建db表。这就是syncdb命令的目的。它将安装的所有应用程序及其内部的模型,创建相应的数据库表格。但是,正如您在问题中提到的,数据库有角色,这些角色有权限。例如,其中一个权限是CREATE,如此处所述。因此,Django文档要求您将所有必要的权限授予一个角色,Django将使用该角色与数据库交互,以便Django能够创建它所需要的必要数据表,并可能稍后修改它们。


所以,我仍然需要理解的是:一旦我为Django创建了一个角色,可能在特定数据库的psql会话中使用SQL语句,我如何告诉Django使用该角色?此外,我是否必须为每个数据库/项目设置不同的角色,还是可以在PostgreSQL中只有一个Django角色,Django始终使用它来与任何数据库交互?另外,听起来真正需要访问的是syncdb命令。那么,我是否在syncdb的命令行上指定角色? - Colin Keenan
1
дҪ еҸҜд»ҘеңЁDjangoзҡ„settings.pyдёӯжҢҮе®ҡи§’иүІгҖӮжңүе…іжӣҙеӨҡдҝЎжҒҜпјҢиҜ·еҸӮйҳ…Djangoж•ҷзЁӢгҖӮиҮідәҺи§’иүІж•°йҮҸ-дҪ еҸҜд»ҘйҖүжӢ©дёәжҜҸдёӘйЎ№зӣ®и®ҫзҪ®дёҖдёӘи§’иүІжҲ–дёәжүҖжңүйЎ№зӣ®и®ҫзҪ®дёҖдёӘеҚ•дёҖи§’иүІгҖӮ - miki725

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接