防止写入特定表(只读表)

时间:2013-08-05 15:37:00

标签: sqlalchemy pyramid

使用Pyramid with SQLAlchemy时,有没有办法将表标记为只读?

一些简短的背景:我正在使用一个非常复杂的现有数据库的应用程序。我的应用程序为此数据库添加了一些新表,但更新(更新,插入,删除)其他表是不安全的,因为架构不是很好理解(并且没有记录)。

我的基本目标是在任何不安全的数据库更新之前快速失败,以便找到并删除有问题的代码,因此我和未来的开发人员不会导致此应用程序出现任何数据问题。

我天真的方法:添加一个pyramid_tm提交否决挂钩,用于检查要更新的对象(在db会话中是新的,脏的和已删除的),如果有任何只读表,则检查vetos。

是否存在处理此问题的现有机制?还是更好的方法?

1 个答案:

答案 0 :(得分:3)

如果您使用“声明”方法,可以尝试将这些类本身设置为“只读”:

class MyBase(object):
    """
    This class is a superclass of SA-generated Base class,
    which in turn is the superclass of all db-aware classes
    so we can define common functions here
    """

    def __setattr__(self, name, value):
        """
        Raise an exception if attempting to assign to an atribute of a "read-only" object
        Transient attributes need to be prefixed with "_t_"
        """
        if (getattr(self, '__read_only__', False)
          and name != "_sa_instance_state"
          and not name.startswith("_t_")):
            raise ValueError("Trying to assign to %s of a read-only object %s" % (name, self))
        super(MyBase, self).__setattr__(name, value)



Base = declarative_base(cls=MyBase)

同样,您可以尝试覆盖__init__方法以防止对象被实例化。

但是,在应用程序级别解决这个问题感觉有点脆弱 - 我只想在数据库中创建一个特殊用户来连接你的应用程序,这将保存你想要保持原样的表的有限权限。