MySQL到Postgres的转换

时间:2012-09-14 15:32:02

标签: mysql ruby-on-rails ruby postgresql

有谁知道可能导致此错误的原因?我正在尝试将MySQL网站转换为Postgres,以便我可以在Heroku上托管。我是数据库语法的新手,这个问题一直困扰着我好几天。

PG::Error: ERROR:  syntax error at or near "ON"
LINE 1: ...tores ("key", "value") VALUES ('traffic:hits', 0) ON DUPLICA...
                                                             ^

这是我正在尝试转换的网站的github页面。 https://github.com/jcs/lobsters

这是查询。我添加了反斜杠双引号代替`。

if Rails.env == "test"
  Keystore.connection.execute("INSERT OR IGNORE INTO " <<
    "#{Keystore.table_name} (\"key\", \"value\") VALUES " <<
    "(#{q(key)}, 0)")
  Keystore.connection.execute("UPDATE #{Keystore.table_name} " <<
    "SET \"value\" = \"value\" + #{q(amount)} WHERE \"key\" = #{q(key)}")
else
  Keystore.connection.execute("INSERT INTO #{Keystore.table_name} (" +
    "\"key\", \"value\") VALUES (#{q(key)}, #{q(amount)}) ON DUPLICATE KEY " +
    "UPDATE \"value\" = \"value\" + #{q(amount)}")
end

2 个答案:

答案 0 :(得分:2)

Postgres'INSERT不支持MySQL的变体INSERT ... ON DUPLICATE KEY UPDATE

有关替代方案,请参阅this question的答案。

答案 1 :(得分:0)

昨晚我正在研究这个确切的代码,这是我对如何修复它的初步看法,遵循answer

def self.put(key, value)
key_column = Keystore.connection.quote_column_name("key")
value_column = Keystore.connection.quote_column_name("value")

if Keystore.connection.adapter_name == "SQLite"
  Keystore.connection.execute("INSERT OR REPLACE INTO " <<
    "#{Keystore.table_name} (#{key_column}, #{value_column}) VALUES " <<
    "(#{q(key)}, #{q(value)})")

elsif Keystore.connection.adapter_name == "PostgreSQL"
  Keystore.connection.execute("UPDATE #{Keystore.table_name} " +
    "SET #{value_column} =#{q(value)} WHERE #{key_column} =#{q(key)}")
  Keystore.connection.execute("INSERT INTO #{Keystore.table_name} (#{key_column}, #{value_column}) " +
    "SELECT #{q(key)}, #{q(value)} " +
    "WHERE NOT EXISTS (SELECT 1 FROM #{Keystore.table_name} WHERE #{key_column} = #{q(key)}) "
    )

elsif Keystore.connection.adapter_name == "MySQL" || Keystore.connection.adapter_name == "Mysql2"
  Keystore.connection.execute("INSERT INTO #{Keystore.table_name} (" +
    "#{key_column}, #{value_column}) VALUES (#{q(key)}, #{q(value)}) ON DUPLICATE KEY " +
    "UPDATE #{value_column} = #{q(value)}")

else
  raise "Error: keystore requires db-specific put method."

end

true
end

在龙虾代码库中有很多东西需要修复,而不仅仅是postgres兼容性 - 在其他控制器文件中找到了mysql特定的东西。我正在https://github.com/seltzered/journaltalk在我自己的龙虾叉上处理它们 - 在接下来的一两天内应该在那里进行postgres修复。