使用 SQLAlchemy 时出现“NoneType”对象没有属性“get”错误

Piz*_*zra 5 python sqlalchemy

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

Edit: Basically changed a whole bunch of stuff.
Run Code Online (Sandbox Code Playgroud)

版本信息(如果方便的话):[操作系统: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)
Run Code Online (Sandbox Code Playgroud)

背景:

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

在 SQLAlchemy 代码运行之前,该函数将读取必要的信息并将其存储到类中。有一本名为的字典students,它这样存储:

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

之后,有一个“分配”算法将项目分配给学生。它做得足够好。就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)
Run Code Online (Sandbox Code Playgroud)

之后,我很好奇是否可以打印出学生词典中的所有学生。

for student in students.itervalues():
    print student
Run Code Online (Sandbox Code Playgroud)

除了错误之外我还能得到什么。仅当在调用以下命令尝试按照我的方式打印时,才会发生此错误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'
Run Code Online (Sandbox Code Playgroud)

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

Questions:
Run Code Online (Sandbox Code Playgroud)
  1. SQLAlchemy 是否mapper改变了原始类/字典的任何内容?
  2. 这对于get字典的工作方式有什么特殊的吗?

Den*_*ach 2

您在映射类之前创建Student实例,将类修改为 SQLAlchemy 需要的类。所以你的实例没有正确初始化。只需在调用放置创建Student实例的行,一切就会按预期工作。mapper(Student, students_table)