Suppose the following code:

# We define a base for all DB objects, currently empty.
class _Base:
    pass

Base = declarative_base(cls=_Base, metadata=MetaData(naming_convention=…))

# Then the objects.
class User(Base):
    __tablename__ = "users"

    id = Column(UUID(), default=uuid.uuid4, primary_key=True)
    …

For the majority of code this works well and the id is initialized whenever 
the object is committed. However, there are cases when I need to get a hold 
of a new object’s id and that happens before the commit. In such cases the 
id is not set yet, and I have extra code which sets the id manually.

That feels crummy to me.

Now I wonder if that’s poor implementation because a new object should 
always be committed before use, or if I should perhaps expand the _Base 
class, for example:

class _Base:

    def __init__(self, *args, **kwargs):
        super().__init__(args, kwargs)
        if hasargs(self, "id"):
            self.id = uuid.uuid4()

That way, every object would have an id assigned and if the object is 
loaded from the db then that initial id would be overwritten. Not pretty 
either, but maybe less crummy than the current implementation.

What are your thoughts?

Much thanks!
Jens

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy-alembic" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy-alembic+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to