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'