05.07 对象关系映射

对象关系映射

数据库中的记录可以与一个 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 来实现这种对应:

 1from sqlalchemy.ext.declarative import declarative_base
 2from sqlalchemy import Column, Date, Float, Integer, String
 3
 4Base = declarative_base()
 5
 6class 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 对象:

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

调用方法:

1order.get_cost()
-187540.0

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

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

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

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

显示是否添加成功:

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

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

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

返回列表的第一个:

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