Hi, 

So currently django seems to take the name of your models (either inferring 
it from the model class name or, if provided, it takes it from the model 
Meta options), and prepends the name of the app the model belongs to with 
an underscore to avoid table name conflicts. It then creates that table in 
the database's default schema ('public' for postgres, 'dbo' for SQL server, 
etc.). So, my model 'Example' in my app 'some_app' becomes, on postgres,  
'public.some_app_example'.

I propose an alternate mode of behaviour that can be toggled with a default 
False (to preserve backwards-compatibility) setting. Something like 
SCHEMA_PARTITION_TABLES_BY_APP (I'm sure there's a better name).

When active, django would instead create a schema for each active app and 
then create the model tables for that app within that schema, rather than 
placing all tables within the default database schema. In my above example, 
django would check if the schema 'some_app' exists and if not would emit a 
'CREATE SCHEMA some_app' statement. Then it would create my model as 
'example' within the schema 'some_app' (the fully qualified name within the 
database is therefore 'some_app.example').

If this option is enabled and the database backend in use does not support 
schemas (such as sqlite), the behavior should be either:

1) explicitly raise an error prompting the user to change this setting
2) silently default to the current behaviour

Whichever one seems more in line with Django's design philosophy.

Is there any chance this could be done? The use of schemas have many 
advantages over the current behaviour. There are small ones like improved 
legibility and better consistency with Python and SQL namespaces, but also 
large advantages like better database organization and the the ability to 
assign different access permissions to the data held by individual apps 
within a large django application. This would allow the data of a 
security-critical app within a django project to only be accessed directly 
by a small number of admin users, while the data within other apps could be 
accessed and manipulated more easily by a larger base of database 
maintainers or data analysts.

I realize that you can currently sort-of achieve this by manually creating 
the schemas ahead of time and explicitly naming your tables making use of 
dot-notation. But this represents extra effort, extra verbosity, requires 
refactoring if you move a model from one app to another, and does not 
provide any way of schema-segregating the tables of community apps 
installed by pip that you're making use of, which means you cannot 
consistently use schemas as a tool for database organization, as your 
default schema will still end up cluttered.

I'd love for this to become a new feature. Thanks in advance for your 
consideration.

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/6743ebe8-d2f7-46e8-b29a-75174894d91e%40googlegroups.com.

Reply via email to