*The goal* 
I have an ORM model. 

class MyModel(Model):
    __tablename__ = 'my_model'
    col1 = db.Column(db.Boolean, default=False, server_default=false())
    col2 = db.Column(db.Integer, default=100, server_default=null())



I want to be able to create an object and have col1 and col2 be populated 
with default values even before the object is committed or even added to a 
session.

For example:
>>> print(MyModel().col1)
False
>>> print(MyModel().col2)
100

I came across this answer by Mike Bayer: 
http://stackoverflow.com/a/14013090/925675 where he recommends using either 
__init__() or events.

I decided to use to an event based solution, but I did not want to 
duplicate default values in the listener function, so I trying to do it in 
the following way:

@event.listens_for(MyModel, 'init')
def init(target, args, kwargs):
    target_type = type(target)
    for attr_name in ('col1', 'col2'):
        attr_default = getattr(target_type, attr_name).default
        if attr_default is None:
            continue
        elif attr_default.is_callable:
            kwargs.setdefault(attr_name, attr_default.arg())
        elif attr_default.is_scalar:
            kwargs.setdefault(attr_name, attr_default.arg)
        else:
            raise AttributeError("Unsupported default type of column {}".
format(attr_name))


So far it works for my need, except 2 issues:
1) It does not work with Sequential or Clause defaults, which I don't have 
need for anyway.
2) It completely relies on ColumnDefault internals and partially duplicates 
logic from DefaultExecutionContext._exec_default()

I am wondering if there is a better solution to it?

Thanks,
Anton.






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

Reply via email to