Нужен установщик для столбца в SQLalchemy - PullRequest
0 голосов
/ 05 апреля 2020

в SQLalchemy Мне нужно создать сеттер, который работает следующим образом:

class User():
    def __init__(self, id, email):
        self. id = id
        self.email = email

    @property
    def account(self):
        return self.email.replace('@','_at_')

    @account.setter
    def account(self):
     self.email = self.email.replace('@','_at_')

u1 = User(1, 'emailadress@nowhere.com')
print(u1.id, u1.email, u1.account)
u1.email = 'email@nirvana.org'
print(u1.id, u1.email, u1.account)

Результат именно то, что я хочу:

1 emailadress@nowhere.com emailadress@nowhere.com 1 email@nirvana.org email@nirvana.org

Я пытался приспособить это к SQLalchemy, но account не фиксируется в базе данных:

    Base = declarative_base()

    class User(Base):
        __tablename__ = "Users"
        id = Column('id', Integer, primary_key=True)
        email = Column('email', String)
        _account = Column('account', String)

        def __init__(self, id, email):
            self.id = id
            self.email = email

        @hybrid_property
        def account(self):
            return self._account

        @account.setter
        def account(self):
            self._account = self.email.replace('@','_at_')

    engine = create_engine('sqlite:///test.db', echo=False)
    Base.metadata.create_all(bind=engine)
    session = Session(engine)

u1 = User(1, 'some@mail.org')

print(u1.id, u1.email, u1.account)

session.add(u1)
session.commit()
session.close()

Что я здесь не так делаю? В терминале результат в порядке:

1 some@mail.org some_at_mail.org

Но в базу данных u1.account передается с None:

 INFO sqlalchemy.engine.base.Engine INSERT INTO "Users" (id, email, account) VALUES (?, ?, ?)
 INFO sqlalchemy.engine.base.Engine (1, 'some@mail.org', None)

Заранее большое спасибо!

biaszek

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