对象关系映射

数据库中的记录可以与一个 Python 对象对应。

例如对于上一节中的数据库:

Order Date Stock Quantity Price
A0001 2013-12-01 AAPL 1000 203.4
A0002 2013-12-01 MSFT 1500 167.5
A0003 2013-12-02 GOOG 1500 167.5

可以用一个类来描述:

Attr. Method
Order id Cost
Date
Stock
Quant.
Price

可以使用 sqlalchemy 来实现这种对应:

In [1]:

  1. from sqlalchemy.ext.declarative import declarative_base
  2. from sqlalchemy import Column, Date, Float, Integer, String
  3.  
  4. Base = declarative_base()
  5.  
  6. class Order(Base):
  7. __tablename__ = 'orders'
  8.  
  9. order_id = Column(String, primary_key=True)
  10. date = Column(Date)
  11. symbol = Column(String)
  12. quantity = Column(Integer)
  13. price = Column(Float)
  14.  
  15. def get_cost(self):
  16. return self.quantity*self.price

生成一个 Order 对象:

In [2]:

  1. import datetime
  2. order = Order(order_id='A0004', date=datetime.date.today(), symbol='MSFT', quantity=-1000, price=187.54)

调用方法:

In [3]:

  1. order.get_cost()

Out[3]:

  1. -187540.0

使用上一节生成的数据库产生一个 session

In [4]:

  1. from sqlalchemy import create_engine
  2. from sqlalchemy.orm import sessionmaker
  3.  
  4. engine = create_engine("sqlite:///my_database.sqlite") # 相当于 connection
  5. Session = sessionmaker(bind=engine) # 相当于 cursor
  6. session = Session()

使用这个 session 向数据库中添加刚才生成的对象:

In [5]:

  1. session.add(order)
  2. session.commit()

显示是否添加成功:

In [6]:

  1. for row in engine.execute("SELECT * FROM orders"):
  2. print row
  1. (u'A0001', u'2013-12-01', u'AAPL', 1000, 203.4)
  2. (u'A0002', u'2013-12-01', u'MSFT', 1500, 167.5)
  3. (u'A0003', u'2013-12-02', u'GOOG', 1500, 167.5)
  4. (u'A0004', u'2015-09-10', u'MSFT', -1000, 187.54)

使用 filter 进行查询,返回的是 Order 对象的列表:

In [7]:

  1. for order in session.query(Order).filter(Order.symbol=="AAPL"):
  2. print order.order_id, order.date, order.get_cost()
  1. A0001 2013-12-01 203400.0

返回列表的第一个:

In [8]:

  1. order_2 = session.query(Order).filter(Order.order_id=='A0002').first()

In [9]:

  1. order_2.symbol

Out[9]:

  1. u'MSFT'

原文: https://nbviewer.jupyter.org/github/lijin-THU/notes-python/blob/master/05-advanced-python/05.07-object-relational-mappers.ipynb