python 的 SQLAlchemy操作

转自: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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值