I must agree to good practices but that does not mean I cannot deploy
tested code using the built-in editor.


On Sat, May 5, 2012 at 8:49 PM, Tiago Almeida <tiago.b.alme...@gmail.com>wrote:

> Don't know why one does not use an oodbms. I've never used one. Are there
> any serious alternatives to current rdbms?
>
> Regarding the editor and editing in production. I was expecting that
> argument and think that shouldn't be done unless its some extreme
> emergency. One should not put code in production without testing it
> thoroughly. What if your emergency edit in prod introduces a new bug that
> causes a data loss for the client? Good practice says that you should have
> at least 1  staging server to deploy stuff and test before prod.
>
> Regards
> On May 5, 2012 9:23 PM, "Michele Comitini" <michele.comit...@gmail.com>
> wrote:
>
>> I do not see nothing in web2py that stops a developer from using a
>> third party ORM.
>> Not a common pattern in web2py, because DAL functional approach gives
>> addiction: you forget the COO (Class Object Oriented) and stick to the
>> true semantic of python which is full OO.  COO is typical of many
>> static languages which need a static interface as blueprint for each
>> object to be instantiated.
>> The modeling using DAL is much relational modeling very little OO
>> modeling.
>>
>> I agree it is more about faith and religion, but here a question
>> raises.  I  suppose the answer is somewhere.  I just did not find it
>> yet.
>> Let's suppose that OOP modeling were superior to relational, the
>> question is why we keep using RDBMS's?  There are some serious
>> OODBMS's out there, why use an ORM then?
>>
>>
>> mic
>>
>> 2012/5/5 Massimo Di Pierro <massimo.dipie...@gmail.com>:
>> >
>> >
>> > On Saturday, 5 May 2012 11:51:22 UTC-5, Tiago Almeida wrote:
>> >>
>> >> Thanks for the comment. This is an interesting debate.
>> >>
>> >> Sábado, 5 de Maio de 2012 17:13:07 UTC+1, Massimo Di Pierro escreveu:
>> >>>
>> >>> On Saturday, 5 May 2012 10:23:34 UTC-5, Tiago Almeida wrote:
>> >>>>
>> >>>> Hi,
>> >>>> The issue about dal/orm, like Anthony said, there are tradeoffs to
>> >>>> consider. In my opinion you loose too much not having an orm to gain
>> very
>> >>>> little with the dal. Let me continue my example.
>> >>>> In the Deparment/Teacher hypothetical model, you also have
>> assignment of
>> >>>> Teachers to Departments. This assignment is very simple (for the
>> sake of
>> >>>> brevity) and has the start/end dates of the assignment and the
>> function
>> >>>> (just a string) of the Teacher in that Department.
>> >>>> You now want, Given the ID of a department list all the assignments
>> of
>> >>>> all teachers along with their functions in a cool graphical timeline
>> >>>> fashion.
>> >>>> It's not about how you get the data. It's about the effort you have
>> >>>> implementing this req. and how you organize your code. Do you?
>> >>>> a) write your .selects() in the view function
>> >>>> b) write a historical_assignments(dep_id) function somewhere that
>> hides
>> >>>> the DAL and call it from the view
>> >>>> c) write a computed field on the department model
>> >>>> d) write a method  historical_assignments() on the class Department
>> >>>>
>> >>>> To me, the d) option is by far the most elegant. I would have had the
>> >>>> Department class created anyway, so it's a matter of sticking a
>> method in
>> >>>> there. If I am working with an ORM, by defining the classes, I
>> automagically
>> >>>> get the tables defined. Without it, I have to repeat myself,
>> redefining the
>> >>>> fields and the fields in the tables and their types, etc. etc. in the
>> >>>> persistance layer.
>> >>>> What if I didn't define those classes? Then I couldn't contain these
>> >>>> kinds of business related operations into a single application layer
>> and
>> >>>> they would leak everywhere, for instance in to the views, being much
>> harder
>> >>>> to maintain.
>> >>>
>> >>>
>> >>> this is somewhat a religious matter. We do not like to pollute the
>> >>> namespace with one class per table. We do not even usually do
>> Department =
>> >>> db.define_table(...). We just expose db and access department via
>> >>> db.department. Given this preference:
>> >>>
>> >>> db.departement.historical_assignments = Field.Lazy(lambda departement,
>> >>> date: db(db.teacher.departement)(db.teacher.asdate<date).select())
>> >>>
>> >>> seems simpler and clear than to define a class and a method. It does
>> not
>> >>> pollute the namespace. In fact web2py does allow to create a
>> VirtualField
>> >>> class and map that into table, so that records have fields
>> corresponding to
>> >>> methods. We consider it a legacy feature because users prefer the new
>> >>> syntax.
>> >>> Yet this is kind of a religious issue.
>> >>
>> >>
>> >> It may be a religious issue. I was assuming I already had the class
>> >> defined because it made sense if this hypothetical app had a very
>> complex
>> >> domain layer. Like a very complex MMO game. I really believe that not
>> all
>> >> operations could be patched as virtual fields. What about operations
>> that
>> >> have a side effect, instead of returning something?
>> >
>> >
>> > Perhaps the name virtual fields is not the most descriptive. A virtual
>> > fields is very much like a method in an ORM. You can pass values to it.
>> They
>> > can do everything method can including "side effects" such as writing
>> to the
>> > db.
>> >
>> > db.teacher.give_raise=lambda row,raise:
>> > row.update_record(salary=row.salary+raise)
>> > and you can do:
>> > for teacher in db(db.teacher).select(): teacher.give_raise(5000)
>> >
>> > Virtual fields can also store a state in the row very much like a method
>> > stores member variables, access and change existing ones.
>> > By doing this outside of a class the DAL make it easier to have virtual
>> > fields which are context dependent. For example methods defined only for
>> > users who have permissions, such as:
>> >
>> > if auth.has_permission('give_raise','teacher'):
>> >     db.teacher.give_raise=lambda row,raise:
>> > row.update_record(salary=row.salary+raise)
>> >
>> >
>> >>>>
>> >>>> Regarding the higher  vs different abstraction. A "perfect"
>> persistence
>> >>>> layer (if there is such a thing) allows one to actually forget that
>> you have
>> >>>> a DB system. I honestly don't care, from the biz point of view, if
>> things
>> >>>> are stored in tables in a DB, xml files or sent via the wire to
>> China. I
>> >>>> only care that I create my Departments, .save() them and get them
>> later as
>> >>>> they were saved .get(id=dep_id).
>> >>>
>> >>>
>> >>> We do not want to "forget" that we have a DB system. One can only
>> forget
>> >>> when one builds simple queries. Ifone can only do simple queries than
>> one
>> >>> starts to think a relational database is not good enough. We want to
>> make
>> >>> sure .select() maps in an SQL SELECT, .insert() into SQL INSERT, etc.
>> We do
>> >>> not want to hide database access which can cause performance issues.
>> This is
>> >>> a significative difference. We do no need .save() and .get() because
>> they
>> >>> are kind of like .insert() and .select() but the mapping is not
>> always as
>> >>> clear. Moreover is not very Object Oriented either.
>> >>
>> >> Ok. This is the old issue of performance vs elegance and the correct
>> >> answer really depends on the type of project. When you use Python, you
>> >> "forget" that below you there is probably a cpu with lots of unused
>> vector
>> >> specialized instructions. They could be exposed, but they were not.
>> >>
>> >>
>> >>>>
>> >>>> Do you lose anything with this abstraction? Yes, of course. If you
>> hide
>> >>>> that it's a DB you lose, for instance, DB triggers. It's the normal
>> tradeoff
>> >>>> in any abstraction. If you use TCP, you get delivery guarantees and
>> peace of
>> >>>> mind regarding all the dropped/corrupted packets nonsense while
>> loosing,
>> >>>> say, realtime guarantees. Should we stop using TCP because we loose
>> this
>> >>>> 'realtimeness'? Of course not.
>> >>>> Are there things that you can do with an orm that you can not with
>> adal?
>> >>>> No, it's quite the opposite. The dal exposes more details therefore
>> allows
>> >>>> you to do more. However, by exposing all these details, you get a
>> tool that
>> >>>> is harder to use (in the sense that you have to repeat yourself) for
>> all the
>> >>>> other scenarios where you don't need such details. Python is used
>> because no
>> >>>> one wants to deal with the nonsense of lower level languanges that
>> arise
>> >>>> from exposing too many details (manual memory management, target
>> machine
>> >>>> dependency, etc....).
>> >>>> Lastly, If I am working with an orm and need to implement a really
>> >>>> complex query, nothing stops me from going deeper and use the dal or
>> even
>> >>>> writing SQL.
>> >>>
>> >>>
>> >>> This is what we do not like. The goal of the DAL is to try avoid this
>> as
>> >>> much as possible, although it does not prevent it.
>> >>
>> >> Again, it's a matter of project target.
>> >>
>> >>>
>> >>>
>> >>>>
>> >>>>>
>> >>>>>  look at
>> >>>>> the Django ORM Tutorial example:
>> >>>>>
>> >>>>> Poll.objects.filter(question__startswith='What')
>> >>>>>
>> >>>>> In web2Py DAL it would use more standard python methods:
>> >>>>>
>> >>>>> db( db.Poll.question.startswith("what") ).select()
>> >>>>
>> >>>> I've never said that Django's orm is perfect. That "__operator" thing
>> >>>> could be done in a different way. Anyway I accept that minor
>> annoyance
>> >>>> because it saves me time overall.
>> >>>
>> >>>
>> >>> I see this in a different light. Web2py supported left joins,
>> aggregates,
>> >>> and nested selects 2 years before Django did. While they added those
>> >>> features over time, we added so many other features (list types,
>> native GAE
>> >>> support, geospatial APIs for postgres, mongodb support, teradata
>> support,
>> >>> imap-dal support, expressions, lazy virtual fields, full auditing in
>> all
>> >>> database tables, multiple database support, semi-natural-language
>> query
>> >>> parsing, etc.) that it is pointless to even compare them today, and we
>> >>> managed to remain backward compatible.
>> >>
>> >>
>> >> This post is more of a debate about the usefulness of an orm in general
>> >> than the state of django's orm vs web2py's dal. I've presented my
>> arguments
>> >> for prefering an orm in general, while supporting that for some
>> specialized
>> >> projects you should not use an orm. Regarding the feature set of
>> django, I
>> >> can say that Django suffers from a problem of too much inertia when it
>> comes
>> >> to change. It may be a consequence of having 3 or 4BFDL's instead of 1
>> and a
>> >> much larger community. There are huge, years long discussions about
>> how this
>> >> or that should be done, without conclusions. Also, I won't compare
>> those
>> >> features one by one because I'm not *that* informed about what django
>> >> supports or not.
>> >
>> >
>> > True. Elephants are slower then mice. :-)
>> >
>> >>>
>> >>> The DAL expressions are consistently shorter then the equivalent
>> Django
>> >>> and SQLAlchemy ones (some example here
>> >>> http://www.web2py.com/AlterEgo/default/show/150 and I would love to
>> see a
>> >>> counter example) and support more features than Django does (in the
>> sense we
>> >>> can use the DAL to generate more SQL statements than the Django ORM
>> can).
>> >>>
>> >>> Web2py falls short of SQLAlchemy for support of legacy tables with
>> >>> arbitrary primary keys (but we have been getting better) and for lack
>> of the
>> >>> concept of DB session (because we never needed that).
>> >>>
>> >>> Just for fun two years ago, I implemented a Django-compatible ORM for
>> >>> web2py:
>> >>> http://www.web2py.com/AlterEgo/default/show/189
>> >>> Nobody used it so it died but it would be trivial to improve it to
>> add a
>> >>> mapping between arbitrary methods and virtual fields.
>> >>>
>> >>> Since you are building your own ORM, instead of starting from scratch,
>> >>> you may want to look into proving that and still take advantage of
>> the DAL
>> >>> goodies underneath.
>> >>
>> >>
>> >> I'm not building an orm :) It would be a fun exercise though.
>> >>
>> >>>
>> >>> Anyway, please understand we value your comments as we can learn from
>> >>> them.
>> >>>
>> >>> Massimo
>> >>
>> >>
>> >> As I value this community comments'.
>> >>
>>
>

Reply via email to