That would be a cool feature..1 click deployment of code pulled from a repository.
Regards On May 5, 2012 11:19 PM, "Massimo Di Pierro" <massimo.dipie...@gmail.com> wrote: > I think we all agree that the built in editor if definitively useful. It > does not substitute a normal editor for production quality development, but > there are many occasions when it is useful: quick and dirty fixes, editing > code when there is no ssh access, editing configuration options, etc. > Anyway, the online editor is just one of the tools in the web2py > administrative interface, including mercurial integration, error browser, > web based shell. We are looking into integrating automatic pulls from > github (and other repositories). > > Massimo > > On Saturday, 5 May 2012 16:30:33 UTC-5, Khalil KHAMLICHI wrote: >> >> 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<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<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'. >>>> >> >>>> >>> >>