【发布时间】:2018-12-03 06:32:48
【问题描述】:
我们正在使用 sqlite 数据库的当前应用程序,现在我们必须从 sqlite 迁移到 Postgresql。我已经使用以下续集进行了迁移
sequel -C sqlite://db/development.sqlite3 postgres://username:password@localhost/dbname
迁移后我遇到如下语法错误
SELECT COUNT(*) FROM "devices" WHERE (User_id IS 6 AND mac_address IS "88:83:123:31:68")
ActiveRecord::StatementInvalid (PG::SyntaxError: ERROR: 在“6”处或附近出现语法错误 第 1 行:...ECT COUNT(*) FROM "devices" WHERE (User_id IS 6 AND mac..)
我的控制器我在下面的查询中使用了上述语法
@device_by_user = Device.where("User_id IS #{id} AND mac_address IS \"#{mac}\"")
要求以下 PostgreSQL 查询语法,其中以大写开头的字段名用引号括起来,文本值应该用单引号括起来。
SELECT COUNT(*) FROM "devices" WHERE "User_id"=6 AND mac_address= '88:83:123:31:68';
我需要在适用的地方更改语法吗?或者 Rails 中还有其他可用的方法吗?
谢谢, 亚历克斯
【问题讨论】:
-
我会考虑通过架构并创建迁移以将列重命名为
snake_case,因为这些不一致只会在未来导致不必要的错误。 -
在 SQL 中,双引号表示带引号的标识符,如表或列名,单引号表示字符串。 Sqlite 只是具有将不是已知标识符的双引号值视为字符串的异常行为。我认为这是对 MySQL 兼容性的一些尝试。如果您使用参数并将值绑定到您应该做的那样,它会成为字符串的一个有争议的点。
标签: ruby-on-rails postgresql sqlite