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.ini和env.py文件是默认的。我只是将我的模型导入到我的项目中__init__.py
知道什么可能导致这种行为吗?
(米格尔在评论中回答了这个问题。如果他发布这个答案并且有人在评论中戳我,我会删除这个答案。我发布它只是为了它可以被标记为答案,因为我遇到了同样的问题并且几乎离开了页面在阅读评论之前。)
不要从 继承关联表Base。所有模型都应该继承自db.Model,如下所示:
class FriendRelationship(db.Model):
Run Code Online (Sandbox Code Playgroud)
这就是为什么:
多对多关系有两种模式。基本的一种使用 Table 对象作为关联表。高级方法使用模型,其优点是可以在关联表中存储附加列。您似乎使用的是高级模型,但是如果您使用的是 Flask-SQLAlchemy 那么您的所有模型都应该继承自 db.Model。您不应该直接进入 SQLAlchemy。
| 归档时间: |
|
| 查看次数: |
3268 次 |
| 最近记录: |