Объект "NoneType" не имеет атрибута "get" с использованием SQLAlchemy

Я пытался сопоставить объект с базой данных, используя SQLAlchemy, но столкнулся с проблемой.

Edit: Basically changed a whole bunch of stuff.

Информация о версии, если она удобна: [ОС: 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 функция будет считывать необходимую информацию и хранить ее в классе. Существует словарь под названием students, который хранит это как таковое:

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

Впоследствии существует алгоритм "выделения", который будет выделять проекты студенту. Он делает это достаточно хорошо. 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'
</module>

Я не понимаю, как решить эту проблему, если это проблема. Если требуется дополнительная информация, пожалуйста, спросите, и я предоставлю ее.

Questions:
  • Изменяет ли SQLAlchemy mapper что-либо об исходном классе/словаре?
  • Имеет ли это что-то конкретное, чтобы get работал со словарями?
2 ответа

Вы создаете экземпляры Student перед отображением класса, который изменяет требования к классу SQLAlchemy. Таким образом, ваш экземпляр не был правильно инициализирован. Просто поместите строки, создающие экземпляры Student после вызова mapper(Student, students_table), и все будет работать как ожидалось.


Похоже, что у вас может возникнуть конфликт тени, где Column('id'...) скрывает Student.id. Изменение Student.__init__.id до Student._init__.sid было бы быстрым тестом для подтверждения или опровержения этой гипотезы.

Здесь упоминается это соединение в третьем блоке кода учебник SQLAlchemy по сопоставлениям.

Например, заменив ваш первый фрагмент кода на это смещение:

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

Очевидно, что другие ссылки на Student.id также должны были бы измениться.

licensed under cc by-sa 3.0 with attribution.