2015-03-26 25 views
8

Projemde yeni bir veritabanı oluşturmayı denedim ancak betiği çalıştırdığımda bu hatayı aldım, başka bir projem var. benzer bir tanımlama, daha önce çalıştı, ama şimdi aynı hatayı şimdi al. Python 2.7.8 kullanıyorum ve SQLAlchemy modülünün sürümü 0.9.8. Bu arada, bir proje Flask-SQLAlchemy kullandı, iyi çalışıyor. Kafam karıştı. traceback bilgileri aşağıdaki gibidir:Python SQLAlchemy : AttributeError: Ne 'Column' nesnesinde ne de 'Comparatorer' nesnesinin 'schema' özniteliği var 'şema'

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

Bu hatayı söylediğinde, "TODO:" yorumunuzdaki hatayı mı kaynaklıyorsunuz? – clearlight

+0

Sadece bir yorum, hata sonraki satırda yükseltildi. – earlzo

+1

'TODO'unuzun hemen altında:' Tablo (...) 'a yapılan bir çağrı, eksik olduğunuz ikinci bir parametre olarak bir MetaData' örneğine sahip olmalıdır. – van

cevap

13

tablo tanımı olmalıdır: bildirime sözdizimini tablolara tanımlarken

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

, meta veri örneğin,

Base sınıf bildirimi vasıtasıyla devralınır
Base = declarative_base() 

class ChatLog(Base) 

, ancak eski Tablo sözdizimini kullanarak tabloları tanımlarken, meta veriler açıkça belirtilmelidir.

0

c küçük harfiyle Column yazımından dolayı aynı hatayı aldım. Column olmalıdır.