是否始终需要模型来表示特定的db表?

时间:2013-04-03 05:14:26

标签: python database model-view-controller sqlalchemy

我有一个几乎与模型类同构的数据库,它几乎似乎浪费时间来创建它们。我正在使用sqlalchemy核心(不是orm),我创建了类似于这个示例的网关类:

class BanGate(Gateway):

    def __init__(self):
            super(BanGate, self).__init__('ban')

    def ban_user(self, user, group, exp):
            data = dict(user_id=user, group_id=group, expires=exp)
            self._table.insert(values=data).execute()

    def unban_user(self, user, group):
            cond = and_(self._table.c.user_id == user, self._table.c.group_id == group)
            self._table.delete(whereclause=cond).execute()

class ForumGate(Gateway):

    def __init__(self):
            super(ForumGate, self).__init__('forum')

    def create_forum(self, group, user, title, desc):
            data = dict(group_id=group, creator=user, name=title, description=desc)
            self._table.insert(values=data).execute()

    def delete_forum(self, forum):
            stmt = (self._table.c.forum_id == forum)
            self._table.delete(whereclause=stmt).execute()

创建一个“禁止”或“论坛”类以保持状态并使用这些网关保存它似乎是浪费时间。对于控制器,我正在考虑简单地从请求对象中获取数据并直接使用这些网关对象,这是可取的吗?页面的大部分数据不需要操作,只需保存和/或读取,因此似乎不需要使用模型类。

此外,网关内使用的表类使用自动加载功能,因此我没有定义数据库模式。

所以基本上我如何继续保存数据?我应该创建一个传递给这些网关对象的模型类,还是仅仅直接从请求对象传递网关对象数据?

(另外,“gatway”,我指的是http://martinfowler.com/eaaCatalog/tableDataGateway.html

1 个答案:

答案 0 :(得分:2)

在这种情况下,您需要通过手动编写所有insert()/ update()构造等来重新创建ORM,这比使用那里的持久性和查询工具要多得多。如果“浪费时间”是在代码中定义了类,那么如果你想使用反射,使用像SQLSoup这样的工具或只是滚动类似的东西,或者DeferredReflection,就没有必要这样做。在任何ORM配置中,都可以使用type()动态创建Python类,因此可以动态地利用ORM。