Генерация GUID при создании объекта модели с использованием SQLAlchemy (Python) - PullRequest
0 голосов
/ 30 сентября 2018

Я использую postgres с SQLAlchemy.Я хочу создать объекты профиля и заставить их автоматически генерировать GUID.Однако в настоящее время в идентификаторах моего профиля не хранятся никакие значения, например:

profile = Profile(name='some_profile')
-> print(profile.name)
some_profile
-> print(profile.id)
None

Я рассмотрел, как другие реализуют GUID в своих моделях ( Как я могу использовать UUID в SQLAlchemy? ) Я понимаю, что многие люди не рекомендуют использовать GUID в качестве идентификаторов, но мне хотелось бы знать, где я ошибаюсь, несмотря на это.

Вот моя текущая реализация:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String
from sqlalchemy.types import TypeDecorator, CHAR
import uuid

Base = declarative_base()

class GUID(TypeDecorator):
    """Platform-independent GUID type.

    Uses Postgresql's UUID type, otherwise uses
    CHAR(32), storing as stringified hex values.

    """
    impl = CHAR

    def process_bind_param(self, value, dialect):
        if value is None:
            return value
        elif dialect.name == 'postgresql':
            return str(value)
        else:
            if not isinstance(value, uuid.UUID):
                return "%.32x" % uuid.UUID(value).int
            else:
                # hexstring
                return "%.32x" % value.int

    def process_result_value(self, value, dialect):
        if value is None:
            return value
        else:
            if not isinstance(value, uuid.UUID):
                value = uuid.UUID(value)
            return value



class Profile(Base):
    __tablename__ = 'profile'

    id = Column(GUID(), primary_key=True, default=uuid.uuid4)
    name = Column(String)

Я все еще новичок в Python, но, насколько я понимаю, я объявляю тип своего столбца идентификатора профиля как GUID (настройка с помощью класса GUID).Поэтому значение GUID по умолчанию должно быть успешно сохранено при генерации в этом столбце с помощью uuid.uuid4 ().

Я предполагаю, что с классом GUID нет ничего плохого, но вместо этого в том, как я пытаюсьдля генерации значения по умолчанию в столбце id.

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

1 Ответ

0 голосов
/ 30 сентября 2018

Ваш код правильный!

После того, как вы подтвердите profile, вы можете получить действительный id.

profile = Profile(name='some_profile')
-> print(profile.name)
some_profile
-> print(profile.id)
None

# commit
session.add(profile)
session.commit()

# print saved profile
-> print(profile.name)
some_profile
-> print(profile.id)
ff36e5ff-16b5-4536-bc86-8ec02a53cfc8
...