2012-02-01 35 views
19

Giản, tôi có cấu trúc sau lớp (trong một tập tin duy nhất):SQLAlchemy không thể tìm thấy một tên lớp

Base = declarative_base() 

class Item(Base): 
    __tablename__ = 'item' 
    id = Column(BigInteger, primary_key=True) 
    # ... skip other attrs ... 

class Auction(Base): 
    __tablename__ = 'auction' 
    id = Column(BigInteger, primary_key=True) 
    # ... skipped ... 
    item_id = Column('item', BigInteger, ForeignKey('item.id')) 

    item = relationship('Item', backref='auctions') 

tôi nhận được lỗi sau từ này:

sqlalchemy.exc.InvalidRequestError 
InvalidRequestError: When initializing mapper Mapper|Auction|auction, expression 
    'Item' failed to locate a name ("name 'Item' is not defined"). If this is a 
    class name, consider adding this relationship() to the Auction class after 
    both dependent classes have been defined. 

Tôi không chắc chắn làm thế nào Python không thể tìm thấy các hạng mục, như ngay cả khi đi qua lớp, chứ không phải là tên như một chuỗi, tôi nhận được cùng một lỗi. Tôi đã đấu tranh để tìm các ví dụ về làm thế nào để làm các mối quan hệ đơn giản với SQLAlchemy vì vậy nếu có điều gì đó khá rõ ràng sai ở đây tôi xin lỗi.

+1

Câu trả lời này cũng hữu ích: http://stackoverflow.com/questions/7478403/sqlalchemy-classes-across-files –

+0

Câu trả lời này cũng hữu ích: http://stackoverflow.com/a/4235691/232794 – Sardathrion

Trả lời

17

Điều này tất cả hóa ra là vì cách tôi đã đặt SQLAlchemy lên trong Kim tự tháp. Về cơ bản, bạn cần phải theo dõi this section đối với chữ cái và đảm bảo bạn sử dụng cùng một phiên bản declarative_base làm lớp cơ sở cho từng mô hình.

Tôi cũng không ràng buộc một công cụ cơ sở dữ liệu vào số DBSession mà không làm phiền bạn cho đến khi bạn cố truy cập siêu dữ liệu bảng, điều này xảy ra khi bạn sử dụng các mối quan hệ.

0

Ngoài ra, mặc dù điều này không áp dụng cho OP, đối với bất kỳ ai đích đến đây đều gặp phải lỗi tương tự, hãy kiểm tra để đảm bảo rằng không có tên bảng nào có dấu gạch ngang trong chúng. Ví dụ, một bảng có tên là "phim-thể loại" mà sau đó được sử dụng như là một phụ trong một mối quan hệ SQLAlchemy sẽ tạo ra cùng một lỗi "name 'movie' is not defined", bởi vì nó sẽ chỉ đọc như xa như dấu gạch ngang. Chuyển sang dấu gạch dưới (thay vì dấu gạch ngang) giải quyết được sự cố.

Các vấn đề liên quan