SQLAlchemyfrom sqlalchemy import create_engine db = create_engine('sqlite:///:memory:', echo=True) |
web2pyfrom gluon.sql import DAL, Field db = DAL('sqlite:memory:') As with SQLALchemy, you can import the DAL gluon.sql from any Python app, even if you do not run web2py. Web2py supports SQLite, MySQL, PostgreSQL, Oracle, DB2, Informix, MSSQL FireBird, Ingres and Google Big Table (not all the queries below work with GAE). |
SQLAlchemyfrom sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey metadata = MetaData() users_table = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('fullname', String), Column('password', String) ) |
web2pydb.define_table('users', Field('name'), Field('fullname'), Field('password',type='password'))The 'id' field is implicit although it can be redefined and renamed. web2py has a special 'password' type. It is used when forms are generated from models. web2py also a type='upload' that works like in Django. |
SQLAlchemymetadata.create_all(db) |
web2py(no equivalent) |
SQLAlchemyclass User(object): def __init__(self, name, fullname, password): self.name = name self.fullname = fullname self.password = password def __repr__(self): return " |
web2py# not quite the same but close User = db.define_table('users', Field('name'), Field('fullname'), Field('password',type='password')) |
SQLAlchemyfrom sqlalchemy.orm import mapper mapper(User, users_table) |
web2py(no equivalent) |
SQLAlchemyed_user = User('ed', 'Ed Jones', 'edspassword') ed_user.name |
web2pyed_user = User.insert(name='ed',fullname='Ed Jone',password='edspassword') ed_user.name |
SQLAlchemyfrom sqlalchemy.ext.declarative import declarative_base |
web2py(no equivalent) |
SQLAlchemyBase = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) fullname = Column(String) password = Column(String) def __init__(self, name, fullname, password): self.name = name self.fullname = fullname self.password = password def __repr__(self): return " |
web2py# not quite the same but close User = db.define_table('users', Field('name'), Field('fullname'), Field('password',type='password')) |
SQLAlchemyusers_table = User.__table__ |
web2py(no equivalent) |
SQLAlchemymetadata = Base.metadata |
web2py(no equivalent) |
SQLAlchemyfrom sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=db) |
web2py(no equivalent) |
SQLAlchemySession = sessionmaker() |
web2py(no equivalent) |
SQLAlchemySession.configure(bind=db) # once db is available |
web2py(no equivalent) |
SQLAlchemysession = Session() |
web2py(no equivalent) |
SQLAlchemyed_user = User('ed', 'Ed Jones', 'edspassword') session.add(ed_user) |
web2pyed_user = User.insert(name='ed',fullname='Ed Jone',password='edspassword') |
SQLAlchemyour_user = session.query(User).filter_by(name='ed').first() |
web2pyour_user = db(User.name=='ed').select().first() |
SQLAlchemysession.add_all([ User('wendy', 'Wendy Williams', 'foobar'), User('mary', 'Mary Contrary', 'xxg527'), User('fred', 'Fred Flinstone', 'blah')]) |
web2pyUser.insert(name='wendy',fullname='Wendy Williams',password='foobar') User.insert(name='mary',fullname='Mary Contrary', password='xxg527') User.insert(name='fred',fullname='Fred Flinstone', password='blah') |
SQLAlchemyed_user.password = 'f8s7ccs' |
web2pyed_user.update_record(password='f8s7ccs') |
SQLAlchemysession.dirty |
web2py(no equivalent) |
SQLAlchemysession.new |
web2py(no equivalent) |
SQLAlchemysession.commit() |
web2pydb.commit() |
SQLAlchemyed_user.name = 'Edwardo' |
web2pyed_user.update_record(name = 'Edwardo') |
SQLAlchemysession.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all() |
web2pydb(User.name.belongs(['Edwardo', 'fakeuser'])).select() |
SQLAlchemysession.rollback() |
web2pydb.rollback() |
SQLAlchemyfake_user in session |
web2py(no equivalent) |
SQLAlchemyfor row in session.query(User).order_by(User.id): print row.name, row.fullname |
web2pyfor row in db().select(User.ALL,orderby=User.id): print row.name, row.fullname |
SQLAlchemyfor name, fullname in session.query(User.name, User.fullname): print name, fullname |
web2pyfor row in db().select(User.name, User.fullname): print row.name, row.fullname |
SQLAlchemyfor row in session.query(User, User.name).all(): print row.users, row.name |
web2pyfor row in db().select(User.ALL): print row, row.name |
SQLAlchemyfrom sqlalchemy.orm import aliased user_alias = aliased(User, name='user_alias') for row in session.query(user_alias, user_alias.name.label('name_label')).all(): print row.user_alias, row.name_label |
web2py(no equivalent) |
SQLAlchemyfor row in session.query(User).order_by(User.id)[1:3]: print row |
web2pyfor row in db().select(User.ALL,orderby=db.user.id)[1:3]: print row |
SQLAlchemyfor name in session.query(User.name).filter_by(fullname='Ed Jones'): print name |
web2pyfor row in db(User.fullname=='Ed Jones').select(User.name): print row.name |
SQLAlchemyfor user in session.query(User).filter(User.name=='ed').filter(User.fullname=='Ed Jones'): print user |
web2pyfor name in db(User.name=='ed')(User.fullname=='Ed Jones').select(): print name |
SQLAlchemyquery = session.query(User).filter(User.name.like('%ed')).order_by(User.id) query.all() |
web2pyquery = db(User.name.like('%ed')) query.select(orderby=User.id) |
SQLAlchemyfrom sqlalchemy.orm.exc import MultipleResultsFound try: user = query.one() except MultipleResultsFound, e: print 'error' |
web2pyusers = db(query).select(limitby=(0,2)) user = users.first() if users>2: print 'error' |
SQLAlchemyfor user in session.query(User).filter("id<224").order_by("id").all(): print user.name |
web2pyfor user in db(User.id<224).select(orderby=User.id): print user.name |
SQLAlchemysession.query(User).filter("id<:value and name=:name").\ params(value=224, name='fred').order_by(User.id).one() |
web2py(value, name) = (224, 'fred') db(User.id<value)(User.name==name)(orderby=User.id,limitby=(0,1)).first() |
SQLAlchemysession.query(User).from_statement("SELECT * FROM users where name=:name").params(name='ed').all() |
web2py(no equivalent but DAL and SQL syntax can be mixed in web2py) |
SQLAlchemysession.query(User).filter(User.name.like('%ed')).count() |
web2pydb(User.name.like('%fred')).count() |
SQLAlchemysession.query(User.id, User.name).filter(User.name.like('%ed')).count() |
web2pydb(User.name.like('%ed')).count() |
SQLAlchemysession.query(User.name).group_by(User.name).count() |
web2pydb().select(User.id.count(),groupby=User.name) |
SQLAlchemyfrom sqlalchemy import func session.query(func.count(User.name), User.name).group_by(User.name).all() |
web2pydb().select(User.name,User.name.count(),groupby=User.name) |
SQLAlchemyfrom sqlalchemy import ForeignKey from sqlalchemy.orm import relation, backref class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) email_address = Column(String, nullable=False) user_id = Column(Integer, ForeignKey('users.id')) user = relation(User, backref=backref('addresses', order_by=id)) def __init__(self, email_address): self.email_address = email_address def __repr__(self): return "" % self.email_address |
web2pyAddress = db.define_table('addresses', Field('email_address',notnull=True), Field('user',User)) |
SQLAlchemymetadata.create_all(db) |
web2py(no equivalent) |
SQLAlchemyjack = User('jack', 'Jack Bean', 'gjffdd') jack.addresses |
web2pyjack = User.insert(name='jack',fullname='Jack Nean', password='gjffdd') jack.addresses.select() |
SQLAlchemyjack.addresses = [Address(email_address='jack@google.com'), Address(email_address='j25@yahoo.com')] |
web2pyAddress.insert(user=jack,email_address='jack@google.com') Address.insert(user=jack,email_address='j25@yahoo.com') |
SQLAlchemyjack.addresses[1] |
web2pyjack.addresses.select()[1] |
SQLAlchemyjack.addresses[1].user |
web2pyjack.addresses.select()[1].user |
SQLAlchemysession.add(jack) session.commit() |
web2py(no equivalent) |
SQLAlchemyjack = session.query(User).filter_by(name='jack').one() |
web2pyjack = db(User.name=='jack').select().first() |
SQLAlchemyfrom sqlalchemy.orm import eagerload |
web2py |
SQLAlchemyjack = session.query(User).options(eagerload('addresses')).filter_by(name='jack').one() |
web2pyjack = db(User.name=='jack')(User.id==db.addresses.user).select() |
SQLAlchemyfor u, a in session.query(User, Address).filter(User.id==Address.user_id).\ filter(Address.email_address=='jack@google.com').all(): print u, a |
web2pyfor row in db(User.id==Address.user)\ (Address.email_address=='jack@google.com').select() print row.users, row.addresses |
SQLAlchemyfrom sqlalchemy.orm import join session.query(User).select_from(join(User, Address)).\ filter(Address.email_address=='jack@google.com').all() |
web2pyfor row in db(User.id==Address.user)\ (Address.email_address=='jack@google.com').select() print row.users, row.addresses |
SQLAlchemyfrom sqlalchemy.orm import aliased adalias1 = aliased(Address) adalias2 = aliased(Address) for username, email1, email2 in \ session.query(User.name, adalias1.email_address, adalias2.email_address).\ join((adalias1, User.addresses), (adalias2, User.addresses)).\ filter(adalias1.email_address=='jack@google.com').\ filter(adalias2.email_address=='j25@yahoo.com'): print username, email1, email2 |
web2pyadalias1 = Address.with_alias('adalias1') adalias2 = Address.with_alias('adalias2') for row in db().select(User.name, adalias1.email_address, adalias2.email_address, left = [adalias1.on((adalias1.user==User.id)&\ (adalias1.email_address=='jack@google.com')), adalias2.on((adalias2.user==User.id)&\ (adalias2.email_address=='j25@google.com'))]): print row.users.name, row.adalia1.email_address, row.adalia2.email_address |
SQLAlchemyfrom sqlalchemy.sql import func stmt = session.query(Address.user_id, func.count('*').label('address_count')).group_by(Address.user_id).subquery() for u, count in session.query(User, stmt.c.address_count).\ outerjoin((stmt, User.id==stmt.c.user_id)).order_by(User.id): print u, count |
web2pyfor row in db(User.id==Address.id).select(User.ALL,Address.id.count(),groupby=Address.user): print row.users.name, row._extra[Address.id.count()] |
SQLAlchemystmt = session.query(Address).filter(Address.email_address != 'j25@yahoo.com').subquery() adalias = aliased(Address, stmt) for user, address in session.query(User, adalias).join((adalias, User.addresses)): print user, address |
web2pyfor row in db(Address.email_address != 'j25@yahoo.com')(Address.user==User.id).select(): print row.users.name, row.addresses.email_address |
SQLAlchemyfrom sqlalchemy.sql import exists stmt = exists().where(Address.user_id==User.id) for name, in session.query(User.name).filter(stmt): print name |
web2py(not sure what it does) |
SQLAlchemyfor name, in session.query(User.name).filter(User.addresses.any()): print name |
web2py(no sure what it does) |
SQLAlchemyfor name, in session.query(User.name).\ filter(User.addresses.any(Address.email_address.like('%google%'))): print name |
web2pyfor row in db(User.id.belongs(db(Address.email_address.like('%google%'))\ ._select(Address.user))).select(User.ALL): print user.name |
SQLAlchemysession.query(Address).filter(~Address.user.has(User.name=='jack')).all() |
web2pydb(Address.user==User.id)(User.name!='jack').select(Address.ALL) |
SQLAlchemysession.delete(jack) session.query(User).filter_by(name='jack').count() |
web2pydel User[jack] db(User.name=='jack').count() |
SQLAlchemysession.query(Address).filter( Address.email_address.in_(['jack@google.com', 'j25@yahoo.com']) ).count() |
web2pydb(Address.email_address.belongs(['jack@google.com', 'j25@yahoo.com']).count() |
SQLAlchemysession.close() # roll back and close the transaction from sqlalchemy.orm import clear_mappers clear_mappers() # clear mappers |
web2pydb.rollback() db.close() |
SQLAlchemymapper(User, users_table, properties={ 'addresses':relation(Address, backref='user', cascade="all, delete, delete-orphan") }) |
web2py# at definition of table, cannot be changed Address = db.define_table('addresses', Field('email_address'), Field('user',User,ondelete="cascade")) |
SQLAlchemyjack = session.query(User).get(5) |
web2pyjack = User[5] |
SQLAlchemydel jack.addresses[1] |
web2pydel Address[jack.addresses.select()[1].id] |
SQLAlchemysession.delete(jack) |
web2pydel User[jack.id] |
SQLAlchemy# association table post_keywords = Table('post_keywords', metadata, Column('post_id', Integer, ForeignKey('posts.id')), Column('keyword_id', Integer, ForeignKey('keywords.id')) ) class BlogPost(Base): __tablename__ = 'posts' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) headline = Column(String(255), nullable=False) body = Column(Text) # many to many BlogPost<->Keyword keywords = relation('Keyword', secondary=post_keywords, backref='posts') def __init__(self, headline, body, author): self.author = author self.headline = headline self.body = body def __repr__(self): return "BlogPost(%r, %r, %r)" % (self.headline, self.body, self.author) class Keyword(Base): __tablename__ = 'keywords' id = Column(Integer, primary_key=True) keyword = Column(String(50), nullable=False, unique=True) def __init__(self, keyword): self.keyword = keyword |
web2pyBlogPost = db.define_table('blog_post', Field('user', User), Field('headline',notnull=True), Field('body','text')) Keyword = db.define_table('keywords', Field('keyword', length=50, notnull=true, unique=True)) PostKeyword = db.define_table('post_keywords', Field('post',Post), Field('keyword',Keyword)) |
SQLAlchemyfrom sqlalchemy.orm import backref # "dynamic" loading relation to User BlogPost.author = relation(User, backref=backref('posts', lazy='dynamic')) |
web2py(no equivalent because in web2py every expression always maps in a single SQL query, on RDBS) |
SQLAlchemymetadata.create_all(db) |
web2py(no equivalent) |
SQLAlchemywendy = session.query(User).filter_by(name='wendy').one() |
web2pywendy = db(User.name=='wendy').select().first() |
SQLAlchemypost = BlogPost("Wendy's Blog Post", "This is a test", wendy) session.add(post) |
web2pypost = BlogPost.insert(headline="Wendy's Blog Post",body="This is a test",user=wendy) |
SQLAlchemypost.keywords.append(Keyword('wendy')) post.keywords.append(Keyword('firstpost')) |
web2pyPostKeywords.insert(keyword=Keyword.insert(keyword='wendy'),post=post) PostKeywords.insert(keyword=Keyword.insert(keyword='firstpost'),post=post)Again in web2py one expression never maps into more than one SQL operation. In this case one have to be explicit about performing two inserts per line. |
SQLAlchemysession.query(BlogPost).filter(BlogPost.keywords.any(keyword='firstpost')).all() |
web2pydb(BlogPost.id.belongs(db(PostKeyword.keyword==Keyword.id)\ (Keyword.keyword=='firstpost') \ ._select(PostKeyword.post))).select() |
SQLAlchemysession.query(BlogPost).filter(BlogPost.author==wendy).\ filter(BlogPost.keywords.any(keyword='firstpost')).all() |
web2pydb(BlogPost.id.belongs(db(PostKeyword.keyword==Keyword.id)\ (Keyword.keyword=='firstpost') \ ._select(PostKeyword.post)))(BlogPost.user=wendy).select() |
SQLAlchemywendy.posts.filter(BlogPost.keywords.any(keyword='firstpost')).all() |
web2pydb(BlogPost.id.belongs(db(PostKeyword.keyword==Keyword.id)\ (Keyword.keyword=='firstpost') \ ._select(PostKeyword.post)))(BlogPost.user=wendy).select(BlogPost.ALL) |