SQL 相同查询的 Alchemy ORM 和 Text returns 不同的结果?
SQL Alchemy ORM and Text of same query returns different results?
我目前在 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。为什么会这样?
您的 SQL 语句语法错误。 # 正在将该行变成注释,并且 AND article_id IS NOT NULL
没有被实现。尝试将其更改为
...WHERE shares < 10 AND account_id="account#"
AND article_id IS NOT NULL...
感谢 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)
我目前在 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。为什么会这样?
您的 SQL 语句语法错误。 # 正在将该行变成注释,并且 AND article_id IS NOT NULL
没有被实现。尝试将其更改为
...WHERE shares < 10 AND account_id="account#"
AND article_id IS NOT NULL...
感谢 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)