Py学习  »  DATABASE

如果在查询中使用MySQL函数,则在SQLite下Laravel测试失败

netdjw • 3 年前 • 1400 次点击  

在我的Laravel项目中,我在查询中使用了一些基于MySQL的SQL函数,如下所示:

Post::whereRaw('publish_at < NOW()');
SELECT * FROM posts WHERE publish_at < NOW();

或者这个:

Post::whereRaw('TIMESTAMP(publish_date, publish_time) < NOW()');
SELECT * FROM posts WHERE TIMESTAMP(publish_date, publish_time) < NOW();

这些查询在MySQL db上运行良好,但如果我尝试在SQLite内存数据库上测试它们,它们会失败,因为:

no such function: NOW (SQL: ...)

我想保留MySQL函数的优点,但我不想放弃这些测试,也不想创建其他函数来在测试中使用它。

也许有什么鲜为人知的雄辩功能可以解决这些问题?

你知道我怎样才能让它在两个数据库上都工作吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133289
 
1400 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Bill Karwin
Reply   •   1 楼
Bill Karwin    3 年前

CURRENT_TIMESTAMP 是一种符合标准SQL的特殊语法。这就像一个常数(注意缺少 () 这是调用函数时所期望的)。

它由SQLite支持:

SQLite version 3.32.3 2020-06-18 14:16:19
sqlite> select current_timestamp;
2021-10-17 17:16:02

通过MySQL:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Server version: 5.7.34-37-log Homebrew

mysql> select current_timestamp;
+---------------------+
| current_timestamp   |
+---------------------+
| 2021-10-17 17:16:08 |
+---------------------+

请回复您的评论:

必然会有一些函数在不同的SQL实现之间不可移植。“可移植SQL”是一个神话。在每个SQL实现中,都有其他品牌不支持的各种语法功能或内置函数。

当我在Zend Framework的Zend::Db组件上工作时,我能给出的最好建议就是使用适配器模式。为每个想要支持的数据库创建一个子类,并在每个子类中以不同的方式实现每个功能。

Eloquent允许您开发更有意义的“构建器”方法,使基于模型的查询更加习惯化。 https://dev.to/rocksheep/cleaner-models-with-laravel-eloquent-builders-12h4

您将为每个品牌的数据库开发这些构建方法的单独实现。