Agreed, very funny comment Mike, and a good one:) Thanks.
On Sat, Jun 21, 2014 at 2:52 PM, Mike Bayer <mike...@zzzcomputing.com> wrote: > > On 6/21/14, 4:00 PM, Bao Niu wrote: > > The documentation regarding column_property and hybrid property says > > both methods are intended for linking a sql expression to an > > attribute, which is highly useful. But it is not obvious to junior > > users which one is preferred. > Heh. Well, one is much older than the other, and truthfully it is > also not obvious to *me* which one is preferred :). Hybrid property > is useful for more complex expressions where you'd like to have access > to an in-Python version when you already have an object loaded. > > The way I used hybrids to a great extent, where i would not have used a > column_property(), was on an object that has dozens of methods used in a > complex report, and many of the methods built on each other (this is a > mock version of that): > > class MyReportThing(Base): > # ... > > @hybrid_property > def x(self): > # ... > > @hybrid_property > def y(self): > # ... > > @hybrid_property > def x_y_variance(self): > return variance(self.x, self.y, ...) > > @hybrid_property > def average_foo_x(self): > # .. > > # many more @hybrid_property objects > > > So when we'd generate a full report, we'd load all the MyReportThing > objects in fully. The table had perhaps 20 columns. But the report had > about 100. This is because from those 20 columns, the hybrids produced > 80 other variants of the data within. This processing was much better > accomplished in Python than on the relational database side; we only > had to load 20 columns in and then use those 20 cols to generate many > other answers about that data. if it was all on the DB side there > would have been an enormous SQL statement with 100 columns. > > But we still wanted to make these hybrids, because in some cases the > functions we had on MyReportThing were also useful in a query now and > then to use in query.filter(), like > query.filter(MyReportThing.average_foo_x > 25). In fact most of the > hybrids were part of an abstract interface that applied to many types of > objects, not just MyReportThing, and in this way the hybrids were very > flexible in-Python and sometimes in-SQL methods that didn't otherwise > have any complex interactions within the mapping process. Some > classes would override some of the hybrids to do something differently, > and some of them would even present "in-Python only" for some of them; > the @expression form would be overridden to raise a NotImplementedError > for some objects where calculating the values relied on things that > couldn't be acquired in a simple SQL expression. > > I think for general use, business-level methods, hybrids are a lot more > flexible and work very well with heavily object oriented techniques. > The column_property() on the other hand is more about data that you'd > like to load every time on your object. When there's some view of data > that you really want at the SQL level, every time and up front when you > query(), column_property() can work better for that. But with > column_property() you really can't fall back onto any kind of > Python-side replacement of the feature. It's more rigidly tied to the > structure of how the database is queried. > > column_property() is also used for rudimental mapping tasks, like if two > columns in a table or a JOIN should have the same value. > > > I started by reading the ORM tutorial. The tutorial often references > > links to other pages, which makes it impossible for a newbie to learn > > something just by reading the tutorial itself. > well the tutorial is supposed to give you the general idea of how to > interact between a set of database tables and objects using SQLAlchemy. > However, it isn't by itself going to teach you much about object > oriented programming or about relational database programming > techniques. I'm not sure of your background, but if it is the case that > you're learning a little bit about all three at the same time, that is a > much harder hill to climb. I think this is somewhat the case for most > people that I interact with and is entirely normal - for example, I'm > now learning lots about Openstack, but as it turns out, in order to use > Openstack I really have to learn a whole lot more about networking as > well, and this is hard. But I can't blame Openstack's docs for the fact > that I'm not super clear on routers/subnetworks/etc. and all that, > there's multiple concepts to learn at once. I watch very closely what > people say about SQLAlchemy and at the same time I try to get indicators > for where they are coming from; the people that really love SQLAlchemy > the most are those who already have a database background and are also > not hostile to object oriented programming. The people who are the most > grumpy seem to be those who are learning database programming from the > ground up at the same time. The product by itself, and its > documentation, is only trying to solve the problem of integrating these > two worlds; it can't go too far as it stands into filling in details on > either side of that bridge except to the degree that the work people put > into it makes them more aware. I was assuming that there'd be a lot > more information surrounding SQLAlchemy by this time, that talks about > programming, relational databases, etc. with SQLAlchemy at the center, > but there's not nearly as much as I've hoped. To that end I've added > the videos and tutorials in the library section > http://www.sqlalchemy.org/library.html that I hope would give the > learner who has extra time to watch videos and stuff some more angles on > where things are coming from. It's been a many-year goal for there to > also be a book project that fills in more details regarding techniques. > > > Sometimes I feel overwhelmed by the links to pages that is so > > technically detailed that after reading it I forgot where I left off > > in the tutorial. > this is a common problem when learning about something large....I will > try to keep the main document I'm reading open, then open up side links > in additional tabs so that my regular narrative remains open where I was > reading. Drilling down from general points into details and then out > again can be tedious but in computer programming overall it's ubiquitous. > > > > By the way, in my opinion a primer for newbie users on such advanced > > features is in high demand. > I'm not entirely sure about this, if one is a newbie, shouldn't they > stick with the basic patterns first, and only refer to advanced features > as their use cases find them there? Usually what I look for in a > product is that the new user can at least get up on the bike and pedal > forward. Jumping ramps and doing wheelies sorta comes later and more > slowly.... :) > > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/lT2VbGOACgY/unsubscribe. > To unsubscribe from this group and all its topics, 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. > -- 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.