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

昨天写按照教程写了一下数据库

感觉不是很优雅

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()])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值