2015-03-26 16 views
8

Tôi đã thử tạo một cơ sở dữ liệu mới trong dự án của mình, nhưng tôi gặp lỗi này khi chạy kịch bản. định nghĩa tương tự, nó đã làm việc trước đây, nhưng bây giờ nó nhận được cùng một lỗi ngay bây giờ. Tôi đang sử dụng Python 2.7.8 và phiên bản của mô-đun SQLAlchemy là 0.9.8. Nhân tiện, một dự án sử dụng Flask-SQLAlchemy, nó hoạt động tốt. Tôi bối rối. Thông tin traceback là sau đây:Python SQLAlchemy : AttributeError: Cả đối tượng 'Column' lẫn đối tượng 'Comparator' đều không có thuộc tính 'schema'

Traceback (most recent call last): 
    File "D:/Projects/OO-IM/db_create.py", line 4, in <module> 
    from models import Base 
    File "D:\Projects\OO-IM\models.py", line 15, in <module> 
    Column('followed_id', Integer(), ForeignKey('user.id')) 
    File "C:\Python27\lib\site-packages\sqlalchemy\sql\schema.py", line 369, in __new__ 
    schema = metadata.schema 
    File "C:\Python27\lib\site-packages\sqlalchemy\sql\elements.py", line 662, in __getattr__ 
    key) 
AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'schema' 


from sqlalchemy import create_engine, Column, String, Integer, Text, DateTime, Boolean, ForeignKey, Table 
from sqlalchemy.orm import sessionmaker, relationship, backref 
from sqlalchemy.ext.declarative import declarative_base 

SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/oo_im?charset=utf8" 

Base = declarative_base() 

# TODO:AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'schema' 
friendships = Table('friendships', 
        Column('follower_id', Integer(), ForeignKey('user.id')), 
        Column('followed_id', Integer(), ForeignKey('user.id')) 
) 


class User(Base): 
    __tablename__ = 'user' 
    id = Column(Integer(), primary_key=True) 
    account = Column(String(32), unique=True, nullable=False) 
    password = Column(String(32), nullable=False) 
    followed = relationship("User", 
          secondary=friendships, 
          primaryjoin=(friendships.c.follower_id == id), 
          secondaryjoin=(friendships.c.followed_id == id), 
          backref=backref("followers", lazy="dynamic"), 
          lazy="dynamic") 

    def __init__(self, account, password, followed=None): 
     self.account = account 
     self.password = password 

     if followed: 
      for user in followed: 
       self.follow(user) 

    def follow(self, user): 
     if not self.is_following(user): 
      self.followed.append(user) 
      return self 

    def unfollow(self, user): 
     if self.is_following(user): 
      self.followed.remove(user) 
      return self 

    def is_following(self, user): 
     return self.followed.filter(friendships.c.followed_id == user.id).count() > 0 


class ChatLog(Base): 
    __tablename__ = 'chatlog' 
    id = Column(Integer(), primary_key=True) 
    sender_id = Column(Integer(), ForeignKey('user.id'), nullable=False) 
    receiver_id = Column(Integer(), ForeignKey('user.id'), nullable=False) 
    send_time = Column(DateTime(), nullable=False) 
    received = Column(Boolean(), default=False) 
    content = Column(Text(), nullable=False) 


engine = create_engine(SQLALCHEMY_DATABASE_URI, convert_unicode=True) 
DBSession = sessionmaker(bind=engine) 
+0

Khi bạn nói lỗi này, bạn có đang đề cập đến lỗi trong nhận xét "TODO:" của mình không? – clearlight

+0

Nó chỉ là một bình luận, lỗi được nêu ra ở dòng kế tiếp. – earlzo

+1

Ngay bên dưới 'TODO:' một cuộc gọi đến 'Bảng (...)' phải có một cá thể 'MetaData' như một tham số thứ hai, mà bạn đang thiếu. – van

Trả lời

13

Định nghĩa bảng nên là:

friendships = Table('friendships', 
        Base.metadata, 
        Column('follower_id', Integer(), ForeignKey('user.id')), 
        Column('followed_id', Integer(), ForeignKey('user.id')) 
) 

Khi xác định bảng bằng cách sử dụng cú pháp khai báo, các siêu dữ liệu được thừa hưởng thông qua việc khai báo lớp từ cơ sở, tức là

Base = declarative_base() 

class ChatLog(Base) 

nhưng, khi xác định bảng sử dụng cú pháp Bảng cũ, siêu dữ liệu phải được chỉ định rõ ràng.

0

Tôi đã gặp lỗi tương tự vì tôi đã viết Column với chữ thường c. Nó phải là Column.

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