all I have a question on a Flask with SQL-Alchemy
I am now implementing the Poll app using Flask. During the modeling, I'm facing the problem with many to many relationship. Based on the tutorial on Flask official website, I followed it, but I got a problem when I tried to use it.
Here is the models.py code
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Table, PrimaryKeyConstraint
from sqlalchemy.orm import relationship
from database import Base
from datetime import datetime
respondents_identifier = Table('respondents_identifier',
                               Column('user_id', Integer, ForeignKey('users.id')),
                               Column('poll_id', Integer, ForeignKey('polls.id')),
                               )
class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(20))
    name_string = Column(String(100), unique=True)
    def __init__(self, name=None, name_string=None):
        self.name = name
        self.name_string = name_string
    def __repr__(self):
        return '<User %r %r>' % self.name, self.nameString
class Poll(Base):
    __tablename__ = 'poll'
    id = Column(Integer, primary_key=True)
    subject = Column(String(50))
    question_statement = Column(String(100))
    num_questions = Column(Integer)  # 응답지 개수
    total_participant = Column(Integer)  # 총 참여자 수
    questions = relationship('Question', backref='Poll')
    comments = relationship('Comment', backref='Poll')
    respondents = relationship("User",
                               secondary=respondents_identifier)
    def __init__(self, subject=None, question_statement=None, num_questions=2):
        self.subject = subject
        self.question_statement = question_statement
        self.num_questions = num_questions
        self.total_participant = 0
class Question(Base):
    __tablename__ = 'question'
    id = Column(Integer, primary_key=True)
    choice_num = Column(Integer)
    answer_description = Column(String(50))
    poll_id = Column(Integer, ForeignKey('poll.id'))
    selected_num = Column(Integer)  # 선택된 수
    def __init__(self, choice_num, answer_description=None):
        self.choice_num = choice_num
        self.answer_description = answer_description
        self.selected_num = 0
    def __repr__(self):
        return '<Poll %d %r>' % self.answer_num, self.answer_description
    def set_poll_id(self, poll):
        self.poll_id = poll.id
class Comment(Base):
    __tablename__ = 'comment'
    id = Column(Integer, primary_key=True)
    comment_content = (String(200))
    user_name = (String(20))
    poll_id = Column(Integer, ForeignKey('poll.id'))
    comment_time = Column(DateTime)
    def __init__(self, user_name, comment_content):
        self.user_name = user_name
        self.comment_content = comment_content
        self.comment_time = datetime.now()
and, this is my database.py outside of app directory, this is in the root directory of my project.
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
def init_db():
    # import all modules here that might define models so that
    # they will be registered properly on the metadata.  Otherwise
    # you will have to import them first before calling init_db()
    import HotOpinion.models
    Base.metadata.create_all(bind=engine)
You can notify that, database.py is very similar to given example code on official website.
Here is the Stacktrace of the error.
/Users/junojunho/.pyenv/versions/hotopinion/bin/python /Users/junojunho/Documents/github/HotOpinion/runserver.py
Traceback (most recent call last):
  File "/Users/junojunho/Documents/github/HotOpinion/runserver.py", line 15, in <module>
    init_db()
  File "/Users/junojunho/Documents/github/HotOpinion/database.py", line 17, in init_db
    import HotOpinion.models
  File "/Users/junojunho/Documents/github/HotOpinion/HotOpinion/models.py", line 11, in <module>
    Column('poll_id', Integer, ForeignKey('polls.id')),
  File "/Users/junojunho/.pyenv/versions/hotopinion/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", line 374, in __new__
    schema = metadata.schema
  File "/Users/junojunho/.pyenv/versions/hotopinion/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 735, in __getattr__
    key)
AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'schema'
Process finished with exit code 1
How do I solve it? I don' know where I can start to fix it. If I remove the identifier part, and the relationship between User, and Poll, everything works fine. the problem is that part.
Oh, god. I find a solution. I just add Base.metadata even if I can see the attribute. And I just some fix to database syntax. Here is I did.
respondents_identifier = Table('respondents_identifier',
                               Base.metadata,
                               Column('user_id', Integer, ForeignKey('user.id')),
                               Column('poll_id', Integer, ForeignKey('poll.id')),
                               )
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With