2014-02-20 1 views
0

관계 테이블 감지하지 않습니다증류기 내가 M2M 관계에 대한 몇 가지 관련 테이블과 일부 모델을 정의한

from itsdangerous import TimedJSONWebSignatureSerializer 
from passlib.hash import bcrypt 
from sqlalchemy.ext.declarative import declarative_base 

import app 
from app import db 

Base = declarative_base() 

class UserGroupRelationship(Base): 

    __tablename__ = 'users_groups' 
    id = db.Column(db.Integer, primary_key=True) 
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) 
    group_id = db.Column(db.Integer, db.ForeignKey('groups.id'), primary_key=True) 

class FriendRelationship(Base): 
    __tablename__ = u'users_friends' 

    id = db.Column(db.Integer, primary_key=True) 
    user_left = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) 
    user_right = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) 


class User(db.Model): 

    __tablename__ = u'users' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    email = db.Column(db.String(120), unique=True) 
    password = db.Column(db.String(120)) 
    # ... 
    last_login = db.Column(db.DateTime, default=db.func.now()) 
    friends = db.relationship(FriendRelationship, 
      primaryjoin=id==FriendRelationship.user_left, 
      backref='friends', lazy='dynamic') 
    friends_with = db.relationship(FriendRelationship, 
      primaryjoin=id==FriendRelationship.user_right, 
      backref='friends_with', lazy='dynamic') 


class Group(db.Model): 

    __tablename__ = u'groups' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    users = db.relationship(UserGroupRelationship, 
      primaryjoin=id==UserGroupRelationship.group_id, 
      backref='groups', lazy='dynamic') 


class Device(db.Model): 
    ''' devices linked to users ''' 

    __tablename__ = u'devices' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    uuid = db.Column(db.String(50)) 
    date_added = db.Column(db.DateTime) 
    user_id = db.Column(db.Integer, db.ForeignKey('groups.id')) 

db.Model에서 상속 클래스의 테이블을 생성 않습니다 alembic revision --autogenerate 실행을하지만 내 M2M에 사용되는 테이블 관계.

INFO [alembic.migration] Context impl PostgresqlImpl. 
INFO [alembic.migration] Will assume transactional DDL. 
INFO [alembic.autogenerate] Detected added table u'groups' 
INFO [alembic.autogenerate] Detected added table u'users' 
INFO [alembic.autogenerate] Detected added table u'devices' 
INFO [alembic.autogenerate] Detected added table u'question' 
    Generating /Users/rxdazn/w/xxx/xxx- 
    yyy/migrations/versions/4e47aa7f3050_.py...done 

alembic.inienv.py 파일은 기본 것들입니다. 나는 내 프로젝트를 가져 오기 만하면된다. __init__.py

이 동작을 일으킬 수있는 아이디어가 있습니까?

+1

모델이'db.Model'에서 상속하는 동안 왜 'Base'에서 연관 테이블을 상속합니까? 그들은 모두 모델이 맞지? – Miguel

+0

@Miguel 나는 관계가 단순한 모델과 다른 것이라고 생각했다. 나는 그들이 모델이되어서는 안된다고 생각했다. 'db.Model'에서 상속받은 것이 내 문제를 해결 한 것 같습니다. 제 질문을 해결 된 것으로 표시 할 수 있도록 작성해주세요. 고마워. (그리고 블로그 포스트에도 감사드립니다.) – rxdazn

+0

many-to-many 관계에는 두 가지 패턴이 있습니다. [기본 문서] (http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#many-to-many)는 연관 테이블에 대해 'Table' 개체를 사용합니다. [고급 기능] (http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#association-object)은 모델을 사용하며 추가 테이블을 연결 테이블에 저장할 수 있다는 장점이 있습니다. 당신은 고급 하나를 사용하는 것,하지만 Flask - SQLAlchemy를 사용하는 경우 모든 모델은'db.Model'에서 상속해야합니다, 당신은 직접 SQLAlchemy로 가지 않아야합니다. – Miguel

답변

0

(Miguel이 댓글에 답변했습니다. 게시자가 댓글을 달아 주면 내 대답을 삭제합니다. 같은 문제가 있었기 때문에 답변으로 표시 될 수 있도록 게시했습니다. 댓글을 읽기 전에 페이지를 거의 떠났다.)

Base에서 연결 테이블을 상속하지 마십시오. 모든 모델은 다음과 같이 db.Model에서 상속해야합니다

은 다 대다 관계를 두 가지 패턴이 있습니다

class FriendRelationship(db.Model): 

This 이유입니다. 기본 테이블 인 은 연결 테이블에 Table 개체를 사용합니다. 고급 모델은 모델을 사용하며 연관 테이블에 추가 열을 저장할 수 있다는 이점이 있습니다. 당신은 고급 하나를 사용하는 것 같지만 플라스크 - SQLAlchemy를 사용하는 경우 모든 모델은 db.Model에서 을 상속해야합니다. 직접 SQLAlchemy로 이동하면 안됩니다.

관련 문제