W dniu 21.09.2012 17:19, Michael Bayer pisze:
On Sep 21, 2012, at 10:57 AM, Tefnet Developers wrote:
In fact we used to use metaclass way of handling this problem, but for some
unknown reason it was changed to monkey patching _as_declarative :|
Couple months ago I've read your post:
http://techspot.zzzeek.org/2011/05/17/magic-a-new-orm/
where there is a similar approach (classes generate relation properties). I thought that
in current SQLA it could be done also with column properties, but if not it's fine, it's
not a big of a deal... just wanted to know if I can avoid this "hack".
you can use that approach, it makes use of the "mapper_configured" event, which
for some reason you're saying you can't use.
I didn't say that I can't use mapper_configured event ... I don't know
how to use it :) Please take a look at:
https://gist.github.com/3757273
With event approach (USE_EVENT=True) I have class properties, I can
construct queries, etc, but table columns are not created.
With old monkey-patching approach (USE_EVENT=False) it works, I have
properties, columns are created, etc...
there's other events to use, but often there are other issues that get in the way when
you try to alter mappings within them. You can try "instrument_class":
http://docs.sqlalchemy.org/en/rel_0_7/orm/events.html#sqlalchemy.orm.events.MapperEvents.instrument_class
but the fact that my blog post doesn't use it might indicate I hit problems
when trying to use that one.
Regards
Tomasz Jezierski
Tefnet
W dniu 21.09.2012 16:27, Michael Bayer pisze:
using a class there which replaces itself means you've developed a custom
creational pattern. A less hacky approach would be to subclass
DeclarativeMeta, and just pass it to your Base:
from sqlalchemy.ext.declarative import DeclarativeMeta
class TefnetMeta(DeclarativeMeta):
def __init__(cls, classname, bases, dict_):
for key, value in dict_.items():
if isinstance(value, TefProperty):
dict_[key] = value._config(cls, key)
super(TefnetMeta, cls).__init__(classname, bases, dict_)
Base = declarative_base(metaclass=TefnetMeta)
On Sep 21, 2012, at 10:17 AM, Tefnet Developers wrote:
My example is just the shortest code I could come up with to show a problem,
but in production it doesn't look like this.
We're using class inheritance, metaclass features etc, so changing it to
function is not an option for us :|
W dniu 21.09.2012 15:59, Michael Bayer pisze:
my immediate thought on that code is to replace TefProperty with a function,
since you are discarding TefProperty in any case:
def propInt():
return sa.Column(key, Integer)
not sure how the previous Extension version of the code did this differently,
this is really a class creational pattern.
On Sep 21, 2012, at 2:59 AM, Tefnet Developers wrote:
Hi,
we are trying to migrate our old *Extension based SQLA code to new - event
based.
We also have class based properties that we want to keep. With old SQLA we have had to
monkey-patch _as_declarative function to populate our properties. I wonder if it is
possible to avoid doing it with events? The only close one we found is
"mapper_configured", but I'm afraid it is executed too late. Anyway... I've
prepared some short example code. If you could take a look and advise if/how it can be
done...
To check out where is the problem change USE_EVENT value from True to False.
https://gist.github.com/3757273
Regards,
Tomasz Jezierski
Tefnet
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.