Как peewee обрабатывает автоматическое создание первичных ключей? - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь выяснить, как 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().

. Любая помощь в этом приветствуется!

1 Ответ

0 голосов
/ 08 мая 2018

У меня есть обходной путь для этой проблемы, который заключается в добавлении первичного ключа без автоинкремента в модель с использованием IntegerField(primary_key=True). Затем я использую Model.save(force_insert=True) для вставки вместо обновления при создании нового объекта.

...