Python alembic没有';t检测关系表
我已经为m2m关系定义了一些带有关联表的模型:Python alembic没有';t检测关系表,python,sqlalchemy,flask,alembic,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 UserGroupRelati
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'))
运行alembic 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.ini
和env.py
文件是默认文件。我只需将模型导入到项目的\uu init\uuuuuuupy
你知道是什么导致了这种行为吗?(米格尔在评论中回答了这个问题。如果他发布了这个答案,并且有人在评论中戳我,我会删除这个答案。我发布它只是为了把它标记为答案,因为我有同样的问题,几乎在阅读评论之前离开了页面。)
不要从Base
继承关联表。所有模型都应继承自db.Model
,如下所示:
class FriendRelationship(db.Model):
原因是:
多对多关系有两种模式。基本的 将表对象用于关联表。先进的使用 模型,并具有可以在中存储其他列的优点 关联表。您似乎正在使用高级版本,但如果 你正在使用炼金术,那么你所有的模型都应该继承 来自db.Model。你不应该直接去SQLAlchemy
为什么从
Base
继承关联表,而模型从db.Model
继承?他们都是模型,对吗?@Miguel我认为关系不同于简单的模型。我的意思是我认为他们不应该是模特。从db.Model
继承似乎解决了我的问题。你能不能把它贴出来作为答案,这样我就可以把我的问题标记为已解决?谢谢(也谢谢你的博客帖子!)。多对多关系有两种模式。将表
对象用于关联表。使用模型,并且具有可以在关联表中存储其他列的优点。您似乎正在使用高级模型,但是如果您使用的是Flask SQLAlchemy,那么您的所有模型都应该继承自db.Model
,您不应该直接转到SQLAlchemy。我明白了,继承自db.Model就像使用Django的M2M,带有到属性。我确实在使用炼金术。是的,它确实解决了问题,请看此评论创建一个答案,以便我可以将其标记为已解决!