Я пытаюсь выяснить, как peewee обрабатывает создание первичных ключей при создании таблиц, в которых столбец id
не указан.Моя цель состоит в том, чтобы написать соединитель базы данных для SQL Server через SQL Relay, но я думаю, что этот вопрос может применяться более широко для всех, кто пытается понять, как работает peewee.
В объекте SchemaManager
есть методназывается _create_table
, который имеет дело с созданием таблицы.
def _create_table(self, safe=True, **options):
is_temp = options.pop('temporary', False)
ctx = self._create_context()
ctx.literal('CREATE TEMPORARY TABLE ' if is_temp else 'CREATE TABLE ')
if safe:
ctx.literal('IF NOT EXISTS ')
ctx.sql(self.model).literal(' ')
columns = []
constraints = []
meta = self.model._meta
if meta.composite_key:
pk_columns = [meta.fields[field_name].column
for field_name in meta.primary_key.field_names]
constraints.append(NodeList((SQL('PRIMARY KEY'),
EnclosedNodeList(pk_columns))))
for field in meta.sorted_fields:
columns.append(field.ddl(ctx))
if isinstance(field, ForeignKeyField) and not field.deferred:
constraints.append(field.foreign_key_constraint())
if meta.constraints:
constraints.extend(meta.constraints)
constraints.extend(self._create_table_option_sql(options))
ctx.sql(EnclosedNodeList(columns + constraints))
if meta.without_rowid:
ctx.literal(' WITHOUT ROWID')
return ctx
Я вижу там код создания составного ключа, но я не понимаю, как добавляется простой первичный ключ.
Основная проблема, с которой я сталкиваюсь в своей работе, заключается в том, что первичный ключ создается без свойства IDENTITY
(что неудивительно, поскольку peewee не поддерживает SQL Server).Поэтому без свойства IDENTITY
невозможно создать объекты модели в базе данных, используя Model.create()
.
. Любая помощь в этом приветствуется!