Peewee и raw SQL create заявления - PullRequest
0 голосов
/ 28 мая 2020

У нас есть выделенная база данных Postgres для каждого клиента, поскольку мы не можем обрабатывать миграции базы данных для каждого из них, не сходя с ума, мы используем необработанные файлы SQL. У нас есть один исходный файл SQL, который создает таблицы и вставляет некоторые данные. Проблема возникает после того, как мы пытаемся вставить в таблицу, которая ранее была заполнена исходным сценарием SQL с использованием INSERT INTO предложений.

Каким-то образом ребенок хочет создать новую запись с идентификатором = 1, таким образом поднимая IntegrityrError (мы создали связку из файла SQL). Я не совсем уверен, как справиться с этим сценарием.

У меня есть базовая модель:

class BaseModel(peewee.Model):
    active = peewee.BooleanField(default=True)
    created_at = peewee.DateTimeField(default=datetime.datetime.now)
    updated_at = peewee.DateTimeField(null=True)

    class Meta:
        database = database

Примерная модель, в которой используется BaseModel:

class UserRole(BaseModel):
    user = peewee.ForeignKeyField(User)
    role = peewee.ForeignKeyField(Role)

    class Meta:
        indexes = (
            (('user', 'role'), True),
        )

Скажем, UserRole имеет пять записей из исходного сценария SQL. Если попытаться создать новую запись, используя UserRole.create из приложения flask, то я получаю ошибку целостности, сравнивая ID = 1.

Есть мысли?

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Перед вставкой новых данных вам необходимо исправить последовательности, которые предоставляют вам значения идентификаторов. Здесь - пример того, как это сделать. После этого постарайтесь избегать явных идентификаторов в ваших запросах на вставку, разрешите db присвоить вам значение идентификатора

1 голос
/ 28 мая 2020

Кажется, что в базе данных таблицы неправильно ссылаются на последовательности auto_increment'ing. Например, если в таблице есть столбец «id», который имеет значение по умолчанию для следующего значения последовательности, это последовательность, установленная на правильное значение. Вот пример:

CREATE SEQUENCE user_id_seq;
ALTER TABLE user ALTER user_id SET DEFAULT NEXTVAL('user_id_seq');
select max(id) from user; -- returns 21
SELECT setval('payments_id_seq', 22, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...