使用Pyramid with SQLAlchemy时,有没有办法将表标记为只读?
一些简短的背景:我正在使用一个非常复杂的现有数据库的应用程序。我的应用程序为此数据库添加了一些新表,但更新(更新,插入,删除)其他表是不安全的,因为架构不是很好理解(并且没有记录)。
我的基本目标是在任何不安全的数据库更新之前快速失败,以便找到并删除有问题的代码,因此我和未来的开发人员不会导致此应用程序出现任何数据问题。
我天真的方法:添加一个pyramid_tm提交否决挂钩,用于检查要更新的对象(在db会话中是新的,脏的和已删除的),如果有任何只读表,则检查vetos。
是否存在处理此问题的现有机制?还是更好的方法?
答案 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__
方法以防止对象被实例化。
但是,在应用程序级别解决这个问题感觉有点脆弱 - 我只想在数据库中创建一个特殊用户来连接你的应用程序,这将保存你想要保持原样的表的有限权限。