【发布时间】:2015-08-19 20:15:39
【问题描述】:
今天我决定将我相当新的项目转移到 PostgreSQL,但我遇到了一些问题,其中之一是:
下面是一个完全正常的、功能齐全的 MySQL 模型,适用于追随者/被追随系统,但由于某种原因,我不断收到 SQLAlchemy 错误:
sqlalchemy.exc.ArgumentError: 关系 User.followed 无法确定任何 基于连接条件和 remote_side a 的明确本地/远程列对 论据。考虑使用 remote() 注释来准确标记那些元素 关系远程端的连接条件的 nts。
followers = db.Table(
'followers',
db.Column('follower_id', db.Integer(), db.ForeignKey('users.id'), primary_key=True),
db.Column('followed_id', db.Integer(), db.ForeignKey('users.id'), primary_key=True)
)
class Base(db.Model):
__abstract__ = True
id = db.Column(db.Integer, primary_key=True)
created_at = db.Column(db.DateTime,
default=datetime.datetime.utcnow)
updated_at = db.Column(db.DateTime,
default=datetime.datetime.utcnow,
onupdate=datetime.datetime.utcnow)
class User(Base, UserJsonSerializer, UserMixin):
__tablename__ = 'users'
email = db.Column(db.String(255), unique=True,)
followed = db.relationship(
'User',
secondary=followers,
primaryjoin=(followers.c.follower_id == id),
secondaryjoin=(followers.c.followed_id == id),
backref=db.backref('followers', lazy='dynamic'),
lazy='dynamic'
)
我对 PostgreSQL 很陌生,所以我对这里的问题很迷茫,而且由于这是一个相当复杂的关系,我更不知道该怎么办。
【问题讨论】:
-
在格式化代码时,我发现
updated_at = db.Column(db.DateTime, default=datetime.datetime.utcnow,行有一个悬空大括号。你能修好那条线吗?谢谢。 -
是的,我的错,从我的源文件复制时我漏掉了一行,现在已修复。 :)
-
您得到的错误不是来自 postgresql,如果您唯一要做的就是更改数据库后端,这似乎很奇怪。您使用的是什么版本的 sqlalchemy?两种情况都一样吗?我注意到在以后的版本中似乎不需要使用 primaryjoin/secondaryjoin
-
SqlAlchemy 2.0 on Python 3.5.0b4,上面的代码在 MariaDB 10.0 上运行良好,但在 PostgreSQL 中中断。我用于 SQLA 的 MySQL 方言是 PyMySQL,而 PostgreSQL 方言是 py-postgresql
-
显然我搞砸了,我提到了 SqlAlchemy 1.0.8 和 Flask-SqlAlchemy 2.0,而不是 SqlAlchemy 2.0...
标签: postgresql sqlalchemy database-schema flask-sqlalchemy