Guest User

https://stackoverflow.com/questions/29442635/sqlalchemy-dele

a guest
Apr 10th, 2015
561
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.94 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import contextlib
  3.  
  4. import sqlalchemy
  5. import sqlalchemy.ext.declarative
  6. import sqlalchemy.orm
  7. import sqlalchemy.exc
  8.  
  9. exc = sqlalchemy.exc
  10.  
  11. from sqlalchemy import (
  12.     Column,
  13.     ForeignKey,
  14.     Index,
  15.     Integer,
  16.     Numeric,
  17. )
  18. from sqlalchemy.orm import (
  19.     relationship,
  20. )
  21.  
  22. Base = sqlalchemy.ext.declarative.declarative_base()
  23.  
  24. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  25. class ORDER(Base):
  26.     __tablename__ = 'ORDERS'
  27.    
  28.     ORDERSID = Column(Integer, primary_key=True)
  29.     ORDERSCOST = Column(Numeric(19, 4), nullable=False)
  30.    
  31.     # ORDEREDITEM = relationship("ORDEREDITEM")
  32.     ORDEREDITEM = relationship("ORDEREDITEM", cascade="all,delete")
  33.    
  34. class ORDEREDITEM(Base):
  35.     __tablename__ = 'ORDEREDITEMS'
  36.     __table_args__ = (
  37.         Index('AK_ORDERSID_ITEMID', 'ORDERSID', 'ITEMSID', unique=True),
  38.     )
  39.    
  40.     ORDEREDITEMSID = Column(Integer, primary_key=True)
  41.     # ITEMSID = Column(ForeignKey(u'ITEMS.ITEMSID'), nullable=False, index=True)
  42.     ITEMSID = Column(Integer, nullable=False, index=True)
  43.     ORDERSID = Column(ForeignKey(u'ORDERS.ORDERSID', ondelete=u'CASCADE'), nullable=False)
  44.     ORDEREDITEMSQUANTITY = Column(Integer, nullable=False)
  45.    
  46.     ORDER = relationship(u'ORDER')
  47.    
  48. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  49. engine = sqlalchemy.create_engine('sqlite:///:memory:', echo=False)
  50. Base.metadata.create_all(engine)
  51.  
  52. Session = sqlalchemy.orm.sessionmaker(bind=engine)
  53. DBSession = Session
  54.  
  55. def raise_database_error(error):
  56.     print('db error', error)
  57.  
  58. def main():
  59.     orderID = 1
  60.    
  61.     order = ORDER(
  62.         ORDERSID = orderID,
  63.         ORDERSCOST = 20.0,
  64.     )
  65.     item = ORDEREDITEM(
  66.         ORDEREDITEMSID = 1,
  67.         ITEMSID = 1,
  68.         ORDERSID = orderID,
  69.         ORDEREDITEMSQUANTITY = 2,
  70.     )
  71.     with contextlib.closing(DBSession()) as session:
  72.         session.add(order)
  73.         session.add(item)
  74.         session.commit()
  75.        
  76.         order = session.query(ORDER).filter_by(ORDERSID=orderID).first()
  77.         assert order is not None
  78.        
  79.         item = session.query(ORDEREDITEM).filter_by(ORDEREDITEMSID=1).first()
  80.         assert item is not None
  81.    
  82.     with contextlib.closing(DBSession()) as session:
  83.         try:
  84.             returnedOrder = session.query(ORDER).filter_by(ORDERSID=orderID).first()
  85.             session.delete(returnedOrder)
  86.             session.commit()
  87.         except exc.SQLAlchemyError as error:
  88.             session.rollback()
  89.             raise_database_error(error)
  90.         # else:
  91.         #     return '1'
  92.    
  93.     with contextlib.closing(DBSession()) as session:
  94.         order = session.query(ORDER).filter_by(ORDERSID=orderID).first()
  95.         assert order is None
  96.        
  97.         item = session.query(ORDEREDITEM).filter_by(ORDEREDITEMSID=1).first()
  98.         assert item is None
  99.  
  100. if __name__ == '__main__':
  101.     main()
Add Comment
Please, Sign In to add comment