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

Sqlalchemy 防止写入特定表(只读表),sqlalchemy,pyramid,Sqlalchemy,Pyramid,在将Pyramid与SQLAlchemy一起使用时,是否有方法将表标记为只读 一些简短的背景:我正在使用一个非常复杂的现有数据库开发一个应用程序。我的应用程序向该数据库中添加了一些新表,但是更新(更新、插入、删除)其他表是不安全的,因为模式没有被很好地理解(并且没有文档记录) 我的基本目标是在任何不安全的数据库更新之前快速失败,这样就可以找到并删除有问题的代码,这样我和未来的开发人员就不会对这个应用程序造成任何数据问题 我的天真方法是:添加一个pyramid_tm提交否决钩子,用于检查要更新的对

在将Pyramid与SQLAlchemy一起使用时,是否有方法将表标记为只读

一些简短的背景:我正在使用一个非常复杂的现有数据库开发一个应用程序。我的应用程序向该数据库中添加了一些新表,但是更新(更新、插入、删除)其他表是不安全的,因为模式没有被很好地理解(并且没有文档记录)

我的基本目标是在任何不安全的数据库更新之前快速失败,这样就可以找到并删除有问题的代码,这样我和未来的开发人员就不会对这个应用程序造成任何数据问题

我的天真方法是:添加一个pyramid_tm提交否决钩子,用于检查要更新的对象(在db会话中是新的、脏的和删除的),并检查是否存在任何只读表

有没有一个现有的机制来处理这个问题?还是更好的方法

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

类似地,您可以尝试重写
\uuuu init\uuu
方法,以防止对象被实例化


然而,在应用程序级别解决这个问题感觉有点脆弱——我只想在数据库中创建一个特殊的用户,让你的应用程序与之连接,这将在你想要保持完整的表上保存有限的权限。

即使这是一个非常古老的答案,这个概念仍然有效。但是,我需要创建一个自定义的decellerative_构造函数,而不是重写init方法。在我的回答中,自定义--init--的目的是在尝试实例化对象时引发异常,以确保无法创建该类的新实例,并且仅限于SqlAlchemy从查询返回的实例。是的,我理解。但是,如果我在
MyBase.\uuuu init\uuuu
方法中实现了检查,那么在我的情况下,这就不起作用了。
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)