'psycopg2.errors.InsufficientPrivilege: permission denied for relation django_migrations

What my settings.py for DB looks like:

ALLOWED_HOSTS = ['*']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'fishercoder',
        'USER': 'fishercoderuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

I have created a new and empty db named "fishercoder" this way:

psql -U postgres
create database fishercoder; 
ALTER USER postgres with password 'badpassword!'; 
CREATE USER fishercoderuser WITH PASSWORD 'password';
ALTER ROLE fishercoderuser SET client_encoding TO 'utf8';
ALTER ROLE fishercoderuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE fishercoderuser SET timezone TO 'PST8PDT';
GRANT ALL PRIVILEGES ON DATABASE fishercoder TO fishercoderuser;

Then I've imported my other SQL dump into this new DB successfully by running:psql -U postgres fishercoder < fishercoder_dump.sql

Then I tried to run ./manage.py makemigrations on my Django project on this EC2 instance, but got this error:

Traceback (most recent call last):
  File "/home/ubuntu/myprojectdir/myprojectenv/lib/python3.6/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.InsufficientPrivilege: permission denied for relation django_migrations

I found these three related posts on SO: One, two and three

I tried the commands they suggested:

postgres=# GRANT ALL ON ALL TABLES IN SCHEMA public to fishercoderuser;
GRANT
postgres=# GRANT ALL ON ALL SEQUENCES IN SCHEMA public to fishercoderuser;
GRANT
postgres=# GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to fishercoderuser;
GRANT

no luck, I then restarted my postgresql db: sudo service postgresql restart when I tried to run migrations again, still faced w/ the same error.

More debug info below:

ubuntu@ip-xxx-xxx-xx-xx:~$ psql -U postgres
Password for user postgres:
psql (10.12 (Ubuntu 10.12-0ubuntu0.18.04.1))
Type "help" for help.

postgres=# \dt django_migrations
Did not find any relation named "django_migrations".
postgres=# \d django_migrations
Did not find any relation named "django_migrations".
postgres=#  \dp django_migrations
                            Access privileges
 Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------+------+-------------------+-------------------+----------
(0 rows)

postgres=# SHOW search_path; \dt *.django_migrations
   search_path
-----------------
 "$user", public
(1 row)

Did not find any relation named "*.django_migrations".

postgres=# \dn+ public.
                                     List of schemas
        Name        |  Owner   |  Access privileges   |           Description
--------------------+----------+----------------------+----------------------------------
 information_schema | postgres | postgres=UC/postgres+|
                    |          | =U/postgres          |
 pg_catalog         | postgres | postgres=UC/postgres+| system catalog schema
                    |          | =U/postgres          |
 pg_temp_1          | postgres |                      |
 pg_toast           | postgres |                      | reserved schema for TOAST tables
 pg_toast_temp_1    | postgres |                      |
 public             | postgres | postgres=UC/postgres+| standard public schema
                    |          | =UC/postgres         |
(6 rows)

Any ideas how to fix this?



Solution 1:[1]

After restoring database, all tables will be owned by postgres user.

You need to do this grant:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO <user>;

I got the same problem and that solved.

You'll need also to grant other privileges to Django user:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO <user>;

Solution 2:[2]

Please try using the below command, this worked for me

GRANT rds_superuser TO username;

Solution 3:[3]

I had the following error.

psycopg2.errors.InsufficientPrivilege: permission denied for table django_migrations

Granted privileges of superuser 'postgres' to the one I was working with.

For me, this command worked:

GRANT postgres TO <user>;

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 jrvidotti
Solution 2 nishit chittora
Solution 3 U. Bajpai