Посмотрите, как Django-CMS делает это, они переопределяют поле db_table
в моделях, унаследованных от CMSPlugin
. Основы (которые я также использую для своих собственных вещей) сводятся к следующему:
class SuperFooMetaClass(ModelBase):
def __new__(cls, name, bases, attrs):
new_class = super(SuperFooMetaClass, cls).__new__(cls, name, bases, attrs)
new_class._meta.verbose_name = "...." # perhaps only if not customized
return new_class
class SuperFoo(models.Model):
__metaclass__ = SuperFooMetaClass
....
Вы можете добавить некоторые проверки, например, обновлять только для подклассов (не прямого типа) или обновлять только в том случае, если значение не настроено.
PostgreSQL автоматически создает индексы по первичным ключам и уникальным ограничениям, но не по ссылочной стороне отношений внешнего ключа.
Когда Pg создает неявный индекс, он выдает сообщение уровня NOTICE
, которое вы можете увидеть в psql
и / или в системных журналах, чтобы вы могли видеть, когда это произойдет. Автоматически созданные индексы также видны в выводе \ d
для таблицы.
В документации по уникальным индексам говорится:
PostgreSQL автоматически создает индекс для каждого уникального ограничения и ограничение первичного ключа для обеспечения уникальности. Таким образом, нет необходимости явно создавать индекс для столбцов первичного ключа.
и документация по ограничениям говорит: указанный столбец потребует сканирования справочной таблицы для строк, соответствующих старому значению, часто бывает полезно проиндексировать ссылающиеся столбцы. Потому что это не всегда нужно, и есть много вариантов индексации, объявление внешнего ключа ограничение не создает автоматически индекс для ссылки столбцы.
Следовательно, вы должны сами создавать индексы для внешних ключей, если хотите.
Обратите внимание, что если вы используете первичные внешние ключи, такие как 2 FK в качестве PK в таблице M-to-N, у вас будет индекс на ПК, и, вероятно, вам не нужно будет создавать какие-либо дополнительные индексы.
Хотя обычно рекомендуется создать индекс (или включая) ваши столбцы внешнего ключа на стороне ссылки, это не обязательный. Каждый добавляемый вами индекс немного замедляет операции DML, поэтому вы платите за производительность при каждом INSERT
, UPDATE
или DELETE
. Если индекс используется редко, возможно, его не стоит иметь.
Если вы хотите перечислить индексы всех таблиц в вашей схеме (ах) из вашей программы вся информация находится под рукой в каталоге:
select
n.nspname as "Schema"
,t.relname as "Table"
,c.relname as "Index"
from
pg_catalog.pg_class c
join pg_catalog.pg_namespace n on n.oid = c.relnamespace
join pg_catalog.pg_index i on i.indexrelid = c.oid
join pg_catalog.pg_class t on i.indrelid = t.oid
where
c.relkind = 'i'
and n.nspname not in ('pg_catalog', 'pg_toast')
and pg_catalog.pg_table_is_visible(c.oid)
order by
n.nspname
,t.relname
,c.relname
Если вы хотите вникнуть дальше (например, столбцы и порядок), вам нужно посмотреть pg_catalog.pg_index. Использование psql -E [dbname]
полезно для выяснения того, как запрашивать каталог.
select
n.nspname as "Schema"
,t.relname as "Table"
,c.relname as "Index"
from
pg_catalog.pg_class c
join pg_catalog.pg_namespace n on n.oid = c.relnamespace
join pg_catalog.pg_index i on i.indexrelid = c.oid
join pg_catalog.pg_class t on i.indrelid = t.oid
where
c.relkind = 'i'
and n.nspname not in ('pg_catalog', 'pg_toast')
and pg_catalog.pg_table_is_visible(c.oid)
order by
n.nspname
,t.relname
,c.relname
Если вы хотите вникнуть дальше (например, в столбцы и порядок), вам нужно посмотреть pg_catalog.pg_index. Использование psql -E [dbname]
полезно для выяснения того, как запрашивать каталог.
select
n.nspname as "Schema"
,t.relname as "Table"
,c.relname as "Index"
from
pg_catalog.pg_class c
join pg_catalog.pg_namespace n on n.oid = c.relnamespace
join pg_catalog.pg_index i on i.indexrelid = c.oid
join pg_catalog.pg_class t on i.indrelid = t.oid
where
c.relkind = 'i'
and n.nspname not in ('pg_catalog', 'pg_toast')
and pg_catalog.pg_table_is_visible(c.oid)
order by
n.nspname
,t.relname
,c.relname
Если вы хотите вникнуть дальше (например, в столбцы и порядок), вам нужно посмотреть pg_catalog.pg_index. Использование psql -E [dbname]
полезно для выяснения того, как запрашивать каталог.
Да - для первичных ключей, нет - для внешних ключей (подробнее в docs ).
\d <table_name>
в «psql» показывает описание таблицы, включая все ее индексы.
Для ПЕРВИЧНОГО КЛЮЧА
будет создан индекс со следующим сообщением:
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "index" for table "table"
Для ИНОСТРАННОГО КЛЮЧА
ограничение не будет создается, если нет индекса в таблице referenc ed .
Индекс в таблице referenc ing не требуется (хотя и желателен) и поэтому не будет создаваться неявно.