Given the following definition for my SqlAlchemy class:
class User(Base):
id = Column("user_id", String(60), primary_key=True)
user_name = Column("user_name", String(60), nullable=False)
how can I create an attribute user_id
that maps to id
.
I'd like to migrate my code from using id
to using user_id
. However, there are several system accessing this class, so for a certain amount of time I need both names to be used in queries and for creation
You can use the synonym function:
from sqlalchemy.orm import synonym
class User(Base):
id = Column("user_id", String(60), primary_key=True)
user_name = Column("user_name", String(60), nullable=False)
user_id = synonym("id")
You can use the hybrid_property
decorator , which basically works like a property
in Python.
In your case:
from sqlalchemy.ext.hybrid import hybrid_property
class User(Base):
id = Column("user_id", String(60), primary_key=True)
user_name = Column("user_name", String(60), nullable=False)
@hybrid_property
def user_id(self):
return self.id
@user_id.setter
def user_id(self, user_id: str):
self.id = user_id
Writing
user = User()
user.user_id = "user1"
user.user_name = "a name"
session.add(user)
session.commit()
Reading
session.query(User).filter(
User.user_id == "user1"
).one()
Note:
user_id
as invalid re-declaration. This should be a linter problem. it's no problem when actually running.