我正在学习 sqlalchemy 并想在我的项目中使用它。因为我的项目涉及树结构和很多节点,所以我想在对象持久化到数据库后释放内存。
但是当我为此对 sqlalchemy 进行了一些测试时,我感到困惑的是,创建的对象不会被垃圾收集。
这是我的测试代码:
from sqlalchemy import (create_engine, Column, select, case,
func, ForeignKey)
from sqlalchemy import Integer, String, Boolean
from sqlalchemy.orm import sessionmaker, MapperExtension, aliased
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
import weakref
import sys
import gc
engine = create_engine('sqlite://', echo=True)
Base = declarative_base()
class Cursor(Base):
__tablename__ = 'cursor'
id = Column(Integer, primary_key = True)
spelling = Column(String, nullable = True)
displayname = Column(String, nullable = False)
usr = Column(String, nullable = True)
is_definition = Column(Boolean, nullable = False)
type_id = Column(Integer, ForeignKey('type.id'))
type = relationship('Type',
backref = backref('instances', order_by = id))
class Type(Base):
__tablename__ = 'type'
id = Column(Integer, primary_key = True)
is_const_qualified = Column(Boolean, nullable = False)
obj_type = Type(is_const_qualified=False)
type_ref = weakref.ref(obj_type)
print sys.getrefcount(obj_type)
obj_type = None
print type_ref()
这给了我以下输出:
3
<__main__.Type object at 0x268a490>
因此,在我将其设置obj_type
为 None 之后,它仍然没有被垃圾收集并且仍然存在。为什么会发生这种情况?这是机制declarative_base
吗?
请注意,我使用的是 Python 2.7.3 和 sqlalchemy 0.7.9。