alembic 未检测到关系表

rxd*_*azn 1 python sqlalchemy flask alembic

我已经定义了一些模型,其中包含一些用于 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'))
Run Code Online (Sandbox Code Playgroud)

运行alembic revision --autogenerate确实会为继承自 m2m 关系的类生成表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
Run Code Online (Sandbox Code Playgroud)

我的alembic.inienv.py文件是默认的。我只是将我的模型导入到我的项目中__init__.py

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

Rob*_*ant 7

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

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

class FriendRelationship(db.Model):
Run Code Online (Sandbox Code Playgroud)

就是为什么:

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