- sqlalchemy
- 问题
- 方案
- models.py
- models.py
sqlalchemy
问题
如何在web.py中使用sqlalchemy
方案
创建一个钩子并使用sqlalchemy的scoped session(http://www.sqlalchemy.org/docs/05/session.html#unitofwork_contextual)
import stringimport randomimport webfrom sqlalchemy.orm import scoped_session, sessionmakerfrom models import *urls = ("/", "add","/view", "view")def load_sqla(handler):web.ctx.orm = scoped_session(sessionmaker(bind=engine))try:return handler()except web.HTTPError:web.ctx.orm.commit()raiseexcept:web.ctx.orm.rollback()raisefinally:web.ctx.orm.commit()app = web.application(urls, locals())app.add_processor(load_sqla)class add:def GET(self):web.header('Content-type', 'text/html')fname = "".join(random.choice(string.letters) for i in range(4))lname = "".join(random.choice(string.letters) for i in range(7))u = User(name=fname,fullname=fname + ' ' + lname,password =542)web.ctx.orm.add(u)return "added:" + web.websafe(str(u)) \+ "<br/>" \+ '<a href="/view">view all</a>'class view:def GET(self):web.header('Content-type', 'text/plain')return "\n".join(map(str, web.ctx.orm.query(User).all()))if __name__ == "__main__":app.run()
models.py
from sqlalchemy import create_enginefrom sqlalchemy import Column, Integer, Stringengine = create_engine('sqlite:///mydatabase.db', echo=True)from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)fullname = Column(String)password = Column(String)def __init__(self, name, fullname, password):self.name = nameself.fullname = fullnameself.password = passworddef __repr__(self):return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)users_table = User.__table__metadata = Base.metadataif __name__ == "__main__":metadata.create_all(engine)
在跑程序之前,运行’python models.py’来初始化一次数据库.
