1

我已经为 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'))

runningalembic revision --autogenerate确实会为继承自的类生成表,db.Model但不会为用于我的 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

知道什么可能导致这种行为吗?

4

1 回答 1

4

(米格尔在评论中回答了这个问题。如果他发布它并且有人在评论中戳我,我会删除这个答案。我只是发布它以便可以将其标记为答案,因为我遇到了同样的问题并且几乎离开了页面在阅读评论之前。)

不要从Base. 所有模型都应该继承自db.Model,如下所示:

class FriendRelationship(db.Model):

就是为什么:

多对多关系有两种模式。基本的使用一个 Table 对象作为关联表。高级的使用模型,并且具有可以在关联表中存储附加列的优点。您似乎使用的是高级模型,但如果您使用的是 Flask-SQLAlchemy,那么您的所有模型都应该从 db.Model 继承。你不应该直接去 SQLAlchemy。

于 2014-11-27T09:10:24.183 回答