转自:http://www.oschina.net/translate/sqlalchemy-vs-orms
SQLAlchemy 是Python编程语言里,一个在MIT许可下发布的开源工具和SQL ORM。它首次发布于2006年二月,由Michael Bayer写的。它提供了 “一个知名企业级的持久化模式的,专为高效率和高性能的数据库访问设计的,改编成一个简单的Python域语言的完整套件”。它采用了数据映射模式(像Java中的Hibernate)而不是Active Record模式(像Ruby on Rails的ORM)。
SQLAlchemy 的工作单元 主要使得 有必要限制所有的数据库操作代码到一个特定的数据库session,在该session中控制每个对象的生命周期 。类似于其他的ORM,我们开始于定义declarative_base()的子类,以映射表到Python类。
>>>
from
sqlalchemy
import
Column, String, Integer, ForeignKey
>>>
from
sqlalchemy.orm
import
relationship
>>>
from
sqlalchemy.ext.declarative
import
declarative_base
>>>
>>>
>>> Base
=
declarative_base()
>>>
>>>
>>>
class
Person(Base):
... __tablename__
=
'person'
...
id
=
Column(Integer, primary_key
=
True
)
... name
=
Column(String)
...
>>>
>>>
class
Address(Base):
... __tablename__
=
'address'
...
id
=
Column(Integer, primary_key
=
True
)
... address
=
Column(String)
... person_id
=
Column(Integer, ForeignKey(Person.
id
))
... person
=
relationship(Person)
...
在我们写任何数据库代码前,我们需要为数据库session创建一个数据库引擎。
1
2
|
>>>
from
sqlalchemy
import
create_engine
>>> engine
=
create_engine(
'sqlite:///'
)
|
一当我们创建了数据库引擎,可以继续创建一个数据库会话,并为所有之前定义的 Person和Address 类创建数据库表。
1
2
3
4
|
>>>
from
sqlalchemy.orm
import
sessionmaker
>>> session
=
sessionmaker()
>>> session.configure(bind
=
engine)
>>> Base.metadata.create_all(engine)
|
现在,session 对象对象变成了我们工作单元的构造函数,将和所有后续数据库操作代码和对象关联到一个通过调用它的 __init__() 方法构建的数据库session上。
1
2
3
4
5
|
>>> s
=
session()
>>> p
=
Person(name
=
'person'
)
>>> s.add(p)
>>> a
=
Address(address
=
'address'
, person
=
p)
>>> s.add(a)
|
为了获得或检索数据库中的对象,我们在数据库session对象上调用 query() 和 filter() 方法。
1
2
3
4
5
6
7
8
|
>>> p
=
s.query(Person).
filter
(Person.name
=
=
'person'
).one()
>>> p
>>>
print
"%r, %r"
%
(p.
id
, p.name)
1
,
'person'
>>> a
=
s.query(Address).
filter
(Address.person
=
=
p).one()
>>>
print
"%r, %r"
%
(a.
id
, a.address)
1
,
'address'
|
请留意到目前为止,我们还没有提交任何对数据库的更改,所以新的person和address对象实际上还没存储在数据库中。 调用 s.commit() 将会提交更改,比如,插入一个新的person和一个新的address到数据库中。
1
2
|
>>> s.commit()
>>> s.close()
|