Определите минимальную длину для строкового столбца PostgreSQL с помощью SQLAlchemy - PullRequest
0 голосов
/ 04 мая 2018

Я определяю таблицу PostgreSQL, используя декларативную базу SQLAlchemy, например:

from sqlalchemy import Column, String, BigInteger
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column('id', BigInteger, primary_key=True)
    some_string = Column('some_string', String(256), nullable=False)

Ограничение nullable гарантирует, что some_string не может быть null. Тем не менее, я также хотел бы задать some_string минимальную длину или просто запретить ее использование в качестве пустой строки. Как я могу это сделать?

1 Ответ

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

В идеале мы хотим, чтобы проверка применялась как на уровне базы данных через ограничение, так и , а также в нашей модели, отвергая попытки установить свойство в слишком короткую строку даже перед попыткой сохранить его в база данных. Мы можем сделать первое с CheckConstraint, используя функцию char_length, а второе добавив валидатор . Ниже приведен пример, который обеспечивает минимальную длину 3 символа для some_string:

from sqlalchemy import Column, String, BigInteger
from sqlalchemy.schema import CheckConstraint
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import validates
Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column('id', BigInteger, primary_key=True)
    some_string = Column('some_string', String(256), nullable=False)

    __table_args__ = (
        CheckConstraint('char_length(some_string) > 2',
                        name='some_string_min_length'),
    )

    @validates('some_string')
    def validate_some_string(self, key, some_string) -> str:
        if len(some_string) <= 2:
            raise ValueError('some_string too short')
        return some_string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...