Cra*_*rag 5 sqlalchemy pyramid
将 Pyramid 与 SQLAlchemy 一起使用时,有没有办法将表标记为只读?
一些简短的背景:我正在开发一个具有非常复杂的现有数据库的应用程序。我的应用程序向该数据库添加了一些新表,但更新(更新、插入、删除)其他表是不安全的,因为架构不是很容易理解(并且没有记录)。
我的基本目标是在任何不安全的数据库更新之前快速失败,以便可以找到并删除有问题的代码,因此我和未来的开发人员不会对此应用程序造成任何数据问题。
我天真的方法:添加一个 pyramid_tm commit veto hook,它检查要更新的对象(db 会话中的新对象、脏对象和删除对象),如果有任何只读表,则否决。
是否有现有的机制来处理这个问题?或者更好的方法?
如果您使用“声明式”方法,您可以尝试将类本身设置为“只读”:
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)
Run Code Online (Sandbox Code Playgroud)
同样,您可以尝试覆盖__init__方法以防止对象被实例化。
但是,在应用程序级别解决这个问题感觉有点脆弱 - 我只是想在数据库中创建一个特殊用户供您的应用程序连接,这将节省您想要保持完整的表的有限权限。
| 归档时间: |
|
| 查看次数: |
2146 次 |
| 最近记录: |