'NoneType'对象使用SQLAlchemy没有属性'get'错误

时间:2010-04-09 05:14:07

标签: python sqlalchemy

我一直在尝试使用SQLAlchemy将对象映射到数据库,但遇到了障碍。

Edit: Basically changed a whole bunch of stuff.

版本信息如果方便:[OS:Mac OSX 10.5.8 | Python:2.6.4 | SQLAlchemy:0.5.8]

我要上映的课程:

class Student(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return str(self)

    def __str__(self):
        return "%s %s" %(self.id, self.name)

背景:

现在,我有一个函数可以将文本数据库中的必要信息读入这些对象。该功能或多或少有效,我可以轻松访问对象的信息。

在SQLAlchemy代码运行之前,该函数将读入必要的信息并将其存储到Class中。有一个名为students的字典,它存储如下:

students = {}
students[id] = Student(<all the info from the various "reader" functions>)

之后,有一个“分配”算法将项目分配给学生。它做得很好。如果学生没有成功获得项目,allocated_project仍为None

SQLAlchemy位:

所以在发生这种情况之后,我想将我的对象映射到数据库表。

from sqlalchemy import *
from sqlalchemy.orm import *

engine = create_engine('sqlite:///:memory:', echo=False)
metadata = MetaData()
students_table = Table('studs', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String)
)
metadata.create_all(engine)
mapper(Student, students_table)

此后,我很想知道是否可以打印出学生词典中的所有学生。

for student in students.itervalues():
    print student

我得到的是一个错误。如果尝试按原样打印,调用mapper之后发生此错误:

Traceback (most recent call last):
  File "~/FYP_Tests/FYP_Tests.py", line 140, in <module>
    print student
  File "~/FYP_Tests/Parties.py", line 30, in __str__
    return "%s %s" %(self.id, self.name)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/attributes.py", line 158, in __get__
  return self.impl.get(instance_state(instance), instance_dict(instance))
AttributeError: 'NoneType' object has no attribute 'get'

如果这是一个问题,我不知道如何解决这个问题。如果需要更多信息,请询问,我会提供。

Questions:
  1. SQLAlchemy mapper是否会改变原始类/字典的内容?
  2. 这是否具有get与词典一起使用的特定方式?

2 个答案:

答案 0 :(得分:1)

您正在创建Student实例,然后才会将类修改为SQLAlchemy所需的类。因此,您的实例未正确初始化。只需在调用Student后创建mapper(Student, students_table)个实例的行,一切都会按预期工作。

答案 1 :(得分:0)

看起来你可能会在Column('id'...)隐藏Student.id时出现名称阴影冲突。将Student.__init__.id更改为Student._init__.sid将是确认或反驳此猜想的快速测试。

SQLAlchemy tutorial on mappings的第三个代码块中提到了这种连接。

例如,用这个例子替换你的第一个代码片段:

class Student(object):
    def __init__(self, name, id):
        self.sid = id
        self.name = name
        # and so on

显然,对Student.id的其他引用也必须改变。