2015-03-26 12 views
8

Ho provato a creare un nuovo database nel mio progetto, ma ho ricevuto questo errore quando eseguo lo script, ho un altro progetto che utilizza definizione simile, ha funzionato prima, ma ora ha lo stesso errore ora. Sto usando Python 2.7.8 e la versione del modulo SQLAlchemy è 0.9.8. A proposito, un progetto ha usato Flask-SQLAlchemy, funziona bene. Sono confuso. Le informazioni traceback è la seguente:Python SQLAlchemy: AttributeError: né l'oggetto 'Column' né l'oggetto 'Comparator' hanno un attributo '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

Quando dici questo errore, ti riferisci all'errore nel tuo commento "TODO:"? – clearlight

+0

E 'solo un commento, l'errore è stato sollevato nella riga successiva. – earlzo

+1

Appena sotto il tuo 'TODO:' una chiamata a 'Table (...)' deve avere un'istanza 'MetaData' come secondo parametro, che ti manca. – van

risposta

13

La definizione della tabella dovrebbe essere:

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

Quando si definisce tabelle utilizzando la sintassi dichiarativa, i metadati è ereditato attraverso la dichiarazione della classe dalla base, cioè

Base = declarative_base() 

class ChatLog(Base) 

ma, quando si definiscono le tabelle utilizzando la sintassi della tabella precedente, i metadati devono essere specificati in modo esplicito.

0

Ho avuto lo stesso errore perché ho scritto Column con un minuscolo c. Dovrebbe essere Column.

Problemi correlati