import sqlalchemy as sqla
import sqlalchemy.orm as sqlormfrom sqlalchemy.ext.declarative import declarative_base as sqla_declarative_base
Base = sqla_declarative_base()
engine = sqla.create_engine('sqlite:///test.db', echo=True)
association_table = sqla.Table(
'association', Base.metadata,
sqla.Column('page_id', sqla.Integer, sqla.ForeignKey('page.id')),
sqla.Column('tag_id', sqla.Integer, sqla.ForeignKey('tag.id'))
)
class Page(Base):
__tablename__ = 'page'
id = sqla.Column(sqla.Integer, primary_key=True)
name = sqla.Column(sqla.String)
tags = sqlorm.relationship('Tag', secondary=association_table)
class Tag(Base):
__tablename__ = 'tag'
id = sqla.Column(sqla.Integer, primary_key=True)
name = sqla.Column(sqla.String)
pages = sqlorm.relationship('Page', secondary=association_table)
Base.metadata.bind = engine
Base.metadata.create_all()
Session = sqlorm.scoped_session(sqlorm.sessionmaker(bind=engine))
def save_page():
sess = Session()
try:
page = Page(name='Python API Page')
sess.add(page)
sess.flush()
sess.commit()
finally:
sess.close()
def add_tag():
sess = Session()
try:
python_tag = Tag(name='python')
api_tag = Tag(name='api')
sess.add(python_tag)
sess.add(api_tag)
page = sess.query(Page).first()
page.tags.append(python_tag)
page.tags.append(api_tag)
sess.flush()
sess.commit()
finally:
sess.close()
def remove_tag():
sess = Session()
try:
page = sess.query(Page).first()
api_tag = sess.query(Tag).filter(Tag.name=='api').first()
page.tags.remove(api_tag)
sess.flush()
sess.commit()
finally:
sess.close()
if __name__ == '__main__':
save_page()
add_tag()
remove_tag()