SQLALchemy filter_by()对外键生成奇怪的sql

时间:2013-08-20 04:57:44

标签: sqlalchemy flask flask-sqlalchemy

我正在尝试过滤外键,而我搜索过的所有SO答案都没有任何结果。

我的查询语句在哪里。

testing = Comments\
    .filter(Comments.post_id==post_id)
print(testing)

testing = Comments\
        .query.join(Post, aliased=True)\
        .filter(Comments.post_id==post_id)
print(testing)

这是我的类定义的样子

class Comments(db.Model):

    comment_id =  db.Column(db.Integer, primary_key=True)
    post_id = db.Column(
        db.Integer,
        db.ForeignKey("Post.post_id"),
        nullable=False)

class post(db.Model):
    post_id =  db.Column(db.Integer, primary_key=True)

Comments = db.relationship(
        'Comments',
        backref='Post',
        lazy='dynamic')

从第一种和第二种情况生成的实际SQL查询。他们都有这种奇怪的东西:post_id_1。在这两种情况下,我都得到了一个空集。

FROM "Comments" 
WHERE "Comments".post_id = :post_id_1

FROM "Comments" JOIN "post" AS "post_1" ON "post_1".post_id = "Comments".post_id 
WHERE "Comments".post_id = :post_id_1

如果我做一个简单的

Select * from Comments where post_id = 1

在mysql CLI中我得到了一个结果集。

1 个答案:

答案 0 :(得分:0)

您的模型定义很奇怪,以下部分未正确缩进:

Comments = db.relationship(
        'Comments',
        backref='Post',
        lazy='dynamic')

或许它只是一个复制/粘贴问题(只是为了确定)。

你所谓的“怪异:esc_id_1事物”实际上是一个命名的占位符。当执行SQL语句时,它们将被实际值替换(这主要是为了避免SQL注入,驱动程序负责转义值)。