【问题标题】:SQL Alchemy ORM and Text of same query returns different results?SQLAlchemy ORM和相同查询的文本返回不同的结果?
【发布时间】:2017-03-21 07:19:48
【问题描述】:

我目前有一个 Python 脚本,它使用 SQL Alchemy 的文本函数来执行查询以收集关于我的 Facebook 帖子的统计信息。我正在尝试更新它以使用 ORM,但是对于在我看来是相同的查询,我得到了不同的结果。例如一个文本查询如下:

mysql> SELECT COUNT(facebook_posts.id) AS temphold
FROM facebook_posts
WHERE shares < 10  AND account_id=‘12345’ AND article_id IS NOT NULL
AND date(created_time) > '2016-10-01' AND date(created_time) < '2016-10-05';

+----------+
| temphold |
+----------+
|      104 |
+----------+

1 row in set (0.02 sec)

然后使用 ORM:

under_10 = session.query(func.count(FacebookPost.id)).\
                         filter(FacebookPost.shares < 10,
                                FacebookPost.account_id == '12345',
                                FacebookPost.article_id != None).\
                        filter(FacebookPost.created_time > start,
                               FacebookPost.created_time < end)

under_10 = session.execute(under_10)

当我打印时,查询看起来是一样的:

SELECT count(facebook_posts.id) AS count_1 
FROM facebook_posts 
WHERE facebook_posts.shares < 10 
AND facebook_posts.account_id = '12345' 
AND facebook_posts.article_id IS NOT NULL 
AND facebook_posts.created_time > 2016-10-01 
AND facebook_posts.created_time < 2016-10-05

(150L,)

看起来是一样的,但结果却不同——104 vs 150。为什么会这样?

【问题讨论】:

  • 嗯,那是因为它们不是同一个查询。 date(created_time) &gt; '2016-10-01'created_time &gt; '2016-10-01' 是不同的标准。时间戳2016-10-01 01:00:00 匹配后者但不匹配前者。
  • 是的!这确实是问题所在......而且很尴尬的是我错过了它并被困了几个小时:-(非常感谢!!!

标签: python mysql orm sqlalchemy alchemy


【解决方案1】:

您的 SQL 语句语法错误。 # 正在将该行转换为注释,而 AND article_id IS NOT NULL 未实现。尝试将其更改为

...WHERE shares < 10  AND account_id="account#"
 AND article_id IS NOT NULL...

【讨论】:

  • # 实际上不在我的代码中,我只是不想这样做,但我正在使用的数字实际上是:session.query(func.count(FacebookPost.id))。 \ filter(FacebookPost.shares开始, FacebookPost.created_time
  • 你试过把弯引号改成直引号吗?
【解决方案2】:

感谢univerio 上面的评论,我去寻找如何在 SQL Alchemy 中指定 DATE() 并通过将其更改为以下内容使其工作:

under_10 = session.query(func.count(FacebookPost.id)).\
                         filter(FacebookPost.shares < 10, 
                                FacebookPost.account_id == '1234',
                                FacebookPost.article_id != None).\
                        filter(func.date(FacebookPost.created_time) > start,
                               func.date(FacebookPost.created_time) < end)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2011-06-24
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2013-08-30
    相关资源
    最近更新 更多