Я пытался сопоставить объект с базой данных с помощью 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:
- SQLAlchemy
mapper
что-то меняет в исходном классе / словаре?
- Имеет ли это что-то специфическое для работы
get
со словарями?