2013-08-20 88 views
0

我试图过滤外键,并没有任何我找到的答案已借出任何结果。SQLALchemy filter_by()产生奇怪的外键sql

我的查询语句在哪里。

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 

如果我在MySQL的CLI做一个简单的

Select * from Comments where post_id = 1

我得到一个结果集。

+0

“wierd':pst_id_1's”被称为绑定参数。您可以通过将'echo = True'传递给'create_engine'来查看执行的实际查询。然后会有一个声明哪些参数已被实际传递。因此,您可以准确查看所查询的内容。用这个来找出查询之间的区别。 – javex

回答

0

你的模型定义是怪异,下面的部分是不正确的缩进:

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

或者,也许它只是一个复制/粘贴问题(只是要确定)。

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

+0

缩进在语法上是正确的,它是我的首选方法,用于分解长度超过80个字符的行。 因此,每个其他的sql语句都使用'%s'后跟变量列表。我说这是“怪异的”,因为它没有变量列表,并且它与我仅仅filter_by(comment_id = commit_id)时不一样。奇怪的部分是,我得到不同的SQL语句,具体取决于是否通过整数主键或整数外键过滤。 – AlexLordThorsen