SQLAlchemy version_id_col и version_id_generator не работают с классическим отображением - PullRequest
0 голосов
/ 22 марта 2020

Я изо всех сил пытаюсь создать классическое отображение с использованием SQLAlchemy и Python и использовать version_id_col и version_id_generator, но что-то я делаю неправильно, потому что это не работает.

У меня есть следующий пример:

# metadata
metadata = MetaData()

# define the engine
engine = create_engine("sqlite:///demo.db", echo=True)

# define the session
session = sessionmaker(bind=engine)()

class User:
    def __init__(self, username, version=None):
        self._username = username
        self._version_uuid = version

user = Table(
    "user",
    metadata,
    Column("id", Integer, primary_key=True, autoincrement=True),
    Column("_username", String(30), nullable=False),
    Column("_version_id", String(32), nullable=False),
)

def start_mapper():
    mapper(
        User,
        user,
        order_by="user._username",
        version_id_col="_version_id",
        version_id_generator=lambda version: uuid.uuid4().hex,
    )

def main():

    start_mapper()

    metadata.create_all(bind=engine)

    user = User("madalin")
    session.add(user)
    session.commit()


if __name__ == "__main__":
    main()

И это сообщение об ошибке, которое я получил:

 cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: user._version_id
[SQL: INSERT INTO user (_username, _version_id) VALUES (?, ?)]
[parameters: ('madalin', None)]
(Background on this error at: http://sqlalche.me/e/gkpj)

Я ищу version_id столбец автоматически заполняется следующим свойством version_id_generator=lambda version: uuid.uuid4().hex, в функции mapper

Что я здесь не так делаю?

Спасибо

1 Ответ

0 голосов
/ 22 марта 2020

Мне удалось решить это, изменив это:

def start_mapper():
    mapper(
        User,
        user,
        order_by="user._username",
        version_id_col="_version_id",
        version_id_generator=lambda version: uuid.uuid4().hex,
    )

на это:


def start_mapper():
    mapper(
        User,
        user,
        order_by=user.c._username,
        version_id_col=user.c._version_id,
        version_id_generator=lambda version: uuid.uuid4().hex,
    )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...