Opened 8 years ago
Closed 3 years ago
#27141 closed Cleanup/optimization (fixed)
makemigrations fails with PermissionDenied on django_migrations
Reported by: | Sjoerd Job Postmus | Owned by: | nobody |
---|---|---|---|
Component: | Migrations | Version: | 1.10 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
On a project I'm currently working on, I have read-only access to 1 table on a database.
Similar to #27054, except that the table django_migrations
does exist, I just don't have read-access to it.
Error message:
django.db.utils.ProgrammingError: permission denied for relation django_migrations.
The error occurs in recorder.py:MigrationRecorder.applied_migrations
, specifically the line
return set(tuple(x) for x in self.migration_qs.values_list("app", "name"))
Change History (9)
comment:1 by , 8 years ago
comment:2 by , 8 years ago
Component: | Uncategorized → Migrations |
---|---|
Has patch: | set |
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Cleanup/optimization |
comment:3 by , 8 years ago
Responding to Tim Graham his remark on the pull request:
Sure, you could let us know how inspectdb currently works with this situation. I guess it might hit that exception block. I guess if that's better than silently skipping such tables then that solution may not be ideal, or at least we'd need a new parameter to introspection.table_names() to skip unowned tables.
Yes, I'm indeed hitting the exception handler there. Based on results from Django==1.9.7, it comes from get_table_description
which has a SELECT * FROM %s LIMIT 1
.
So I think what would make the most sense would be to add a try
/except DatabaseError
around the part where the applied migrations are obtained, and then (re-)raise a MigrationSchemaMissing
instead. The error message is after all correct: "\nNot checking migrations as it is not possible to access/create the django_migrations table.".
comment:4 by , 8 years ago
Has patch: | unset |
---|
Feel free to send a pull request to my branch or give my PR a review so we can merge it and continue this ticket in a new PR.
comment:5 by , 8 years ago
In ticket:27142#comment:3 I asked whether or not we should even keep this check in makemigrations
. It's getting tedious to deal with all the edge cases, with questionable benefit in my view.
comment:6 by , 8 years ago
A similar usecase but maybe needing a different solution (or even a different ticket) is that of a read only database connection.
Say you have :
DATABASES = { 'default': ..., 'another_db_rw': ..., 'yet_another_db_r': ..., }
makemigrations will try to "make" migrations for all 3 connections. Maybe a solution for that would be a '--database' option like migrate command ?
comment:7 by , 8 years ago
You should set up database routers so that allow_migrate()
returns False
for read-only connections.
comment:9 by , 3 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Pull request at https://github.com/django/django/pull/7172
Let me know if I missed anything.