浏览 3631 次
锁定老帖子 主题:pylons建站日记3_优雅的建表
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-02
感觉不是很优雅 1.表名和类的名字需要分别写,不符合一处定义的原则 2.要手工把类和table进行orm.mapper,比较麻烦 于是重新写了一个table类来负责对一个类建表,可以统一的在init用Table.do_mapper(orm)来初始化,不需要手工去一个一个的mapper from sqlalchemy import orm from sqlalchemy import types def init_model(bind): """Call me at the beginning of the application. 'bind' is a SQLAlchemy engine or connection, as returned by sa.create_engine, sa.engine_from_config, or engine.connect(). """ global engine, Session engine = bind Session = orm.scoped_session(orm.sessionmaker( transactional=True, autoflush=True, bind=bind) ) Table.do_mapper(orm) import sqlalchemy as sa from datetime import datetime class Table(object): wait_mapper={} meta = sa.MetaData() def __init__(self,cls,*args,**keys): cls.table=sa.Table( cls.__name__,self.meta, *args,**keys ) self.wait_mapper[cls]={} self.cls=cls def mapper(self,**keys): self.wait_mapper[self.cls]=keys @classmethod def do_mapper(cls,orm): wait_mapper=cls.wait_mapper for i,keys in wait_mapper.iteritems(): orm.mapper(i,i.table,**keys) wait_mapper={} class IdTable(Table): def __init__(self,cls,*args,**keys): super(self.__class__,self).__init__(cls, sa.Column("id",types.Integer, primary_key=True,autoincrement=True), *args,**keys ) def ForeignKey(cls,*args,**keys): table_name=cls.table.name return sa.Column( '%s_id'%table_name, types.Integer, sa.ForeignKey('%s.id'%table_name), *args, **keys ) class ResourceSite(object): def __str(self): return self.title IdTable( ResourceSite, sa.Column("href", types.String()), sa.Column("title", types.String(255)), sa.Column("brief", types.String()), sa.Column("update_time", types.DateTime()), ) class Subject(object): def __str(self): return self.title IdTable( Subject, ForeignKey(ResourceSite), sa.Column("href", types.String()), sa.Column("title", types.String(255)), sa.Column("update_time", types.DateTime()), ) class Plunder(object): def __str(self): return self.title IdTable( Plunder, ForeignKey(Subject), sa.Column("href", types.String()), sa.Column("title", types.String(255)), sa.Column("brief", types.String()), sa.Column("update_time", types.DateTime(),default=lambda:datetime.now()), sa.Column("tag", types.String(255)), sa.Column("author", types.String(255)), sa.Column("content", types.String()), ).mapper(order_by=[Plunder.table.c.update_time.desc()]) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-01-03
pylons的官方教材太差,很不系统。
而且API变化大,网上稍微老的的教程就会有问题。 官方教程里的那个wiki教程本是一个不错的入门教程,但如果完全按照教程做根本就没办法跑起来。 总的来说pylons和ROR太像,给我的体验不是很好。 |
|
返回顶楼 | |
发表时间:2008-01-03
pylons也可以支持Elixir,看到网上有些相关的东西。
用Elixir可以对数据库部分的工作进行一定量简化。 |
|
返回顶楼 | |
发表时间:2008-01-03
先简单的写一个自己用用:)
|
|
返回顶楼 | |
发表时间:2008-01-04
国内搞pylons的不多。
django的却很多,都已经有好几个上规模的网站了。 |
|
返回顶楼 | |