论坛首页 编程语言技术论坛

pylons建站日记3_优雅的建表

浏览 3631 次
精华帖 (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()])




   发表时间:2008-01-03  
pylons的官方教材太差,很不系统。
而且API变化大,网上稍微老的的教程就会有问题。
官方教程里的那个wiki教程本是一个不错的入门教程,但如果完全按照教程做根本就没办法跑起来。
总的来说pylons和ROR太像,给我的体验不是很好。
0 请登录后投票
   发表时间:2008-01-03  
pylons也可以支持Elixir,看到网上有些相关的东西。
用Elixir可以对数据库部分的工作进行一定量简化。
0 请登录后投票
   发表时间:2008-01-03  
先简单的写一个自己用用:)
0 请登录后投票
   发表时间:2008-01-04  
国内搞pylons的不多。
django的却很多,都已经有好几个上规模的网站了。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics