【问题标题】:Sqlite to Postgresql Migration in Ruby on RailsRuby on Rails 中的 Sqlite 到 Postgresql 迁移
【发布时间】: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


【解决方案1】:

你应该可以做到:

Device.where({ :user_id => 6, :mac_address => '88:83:123:31:68'}).count

如果您的模型正确,它应该可以工作。 希望有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-24
    • 2015-04-09
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多