Объект 'NoneType' не имеет атрибута 'get' error с использованием SQLAlchemy - PullRequest
3 голосов
/ 09 апреля 2010

Я пытался сопоставить объект с базой данных с помощью 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 функция считывает необходимую информацию и сохраняет ее в классе. Существует словарь под названием 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 ]

1 голос
/ 09 апреля 2010

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

0 голосов
/ 09 апреля 2010

Похоже, что у вас может возникнуть конфликт теней имен, где 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 также должны были бы измениться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...