我正在开发一个库,用户可以在其中简单地声明一些由数据库自动支持的类。简而言之,隐藏在代码中的某个地方,有
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class LibraryBase(Base):
# important library stuff
然后用户应该做
class MyStuff(LibraryBase):
# important personal stuff
class MyStuff_2(LibraryBase):
# important personal stuff
mystuff = MyStuff()
Library.register(mystuff)
mystuff.changeIt() # apply some changes to the instance
Library.save(mystuff) # and save it
# same for all other classes
在静态环境中,例如用户创建了一个包含所有个人类的文件并导入该文件,这非常有效。所有类名都是固定的,SQLAlchemy 知道如何映射每个类。
在交互式环境中,情况有所不同:现在,一个类有可能被定义两次。两个类可能有不同的模块;但 SQLAlchemy 仍然会抱怨:
SAWarning: 类名 'MyStuff' 已经在此声明性基础的注册表中,映射到 <class 'OtherModule.MyStuff' >
有没有办法解决这个问题?我可以以某种方式从它的类中卸载一个类,declarative_base
以便我可以用一个新的类交换它的定义吗?