title: SQLAlchemy is convoluted?
body: <p>This may seems rather argumentative, but I just went through SQLAlchemy's <a href="http://www.sqlalchemy.org/docs/05/ormtutorial.html" rel="noreferrer">ORM tutorial</a> and ended up with the following code:</p>
  
  <pre><code>from sqlalchemy import create_engine
  from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
  from sqlalchemy.ext.declarative import declarative_base
  from sqlalchemy.orm import sessionmaker
  
  engine = create_engine('sqlite:///:memory:', echo=True)
  
  metadata = MetaData()
  users_table = Table('users', metadata,
      Column('id', Integer, primary_key=True),
      Column('name', String),
      Column('fullname', String),
      Column('password', String)
  )
  
  metadata.create_all(engine)
  
  Base = 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 "&lt;User('%s','%s', '%s')&gt;" % (self.name, self.fullname, self.password)
  
  users_table = User.__table__
  metadata = Base.metadata
  
  Session = sessionmaker(bind=engine)
  Session = sessionmaker()
  Session.configure(bind=engine)  # once engine is available
  session = Session()
  
  # actually using the ORM isn't too bad..
  ed_user = User('ed', 'Ed Jones', 'edspassword')
  session.add(ed_user)
  
  our_user = session.query(User).filter_by(name='ed').first() 
  print our_user
  
  session.add_all([
      User('wendy', 'Wendy Williams', 'foobar'),
      User('mary', 'Mary Contrary', 'xxg527'),
      User('fred', 'Fred Flinstone', 'blah')])
  
  ed_user.password = 'f8s7ccs'
  
  print session.dirty
  print session.new
  session.commit()
  
  for instance in session.query(User).order_by(User.id): 
      print instance.name, instance.fullname
  
  for name, fullname in session.query(User.name, User.fullname): 
      print name, fullname
  </code></pre>
  
  <p>This seems incredibly complicated for effectively a Hello World table, especially compared to the roughly similar SQLObject code:</p>
  
  <pre><code>from sqlobject import SQLObject, StringCol, sqlhub, connectionForURI
  
  sqlhub.processConnection = connectionForURI('sqlite:/:memory:')
  
  class Person(SQLObject):
      fname = StringCol()
      mi = StringCol(length=1, default=None)
      lname = StringCol()
  
  Person.createTable()
  
  p = Person(fname="John", lname="Doe")
  p.mi = 'Q'
  p2 = Person.get(1)
  print p2
  print p2 is p
  </code></pre>
  
  <p>I understand SQLAlchemy is "more powerful", but that power seems to come at a cost, or am I missing something?</p>