我正在考虑在Rails开发中从MySQL迁移到Postgres,想听听其他进行过这种迁移的开发者对此的看法。
我寻求的是个人经验,不是Mysql与Postgres之间的比较,只是您自己得出的利弊分析。一些人可能没有想到的事情。
您也可以解释一下为什么首先要进行迁移。
我正在考虑在Rails开发中从MySQL迁移到Postgres,想听听其他进行过这种迁移的开发者对此的看法。
我寻求的是个人经验,不是Mysql与Postgres之间的比较,只是您自己得出的利弊分析。一些人可能没有想到的事情。
您也可以解释一下为什么首先要进行迁移。
哦,亲爱的,这可能会以泪水告终。
仅从个人经验来看,我们之所以放弃MySQL,是因为我们的生产系统(Heroku)运行的是PostgreSQL。我们有专门为MySQL构建的查询,在PostgreSQL上出现了问题。因此,我想这个故事的寓意就是尽量在同一种DBMS上运行,否则你可能会遇到问题。
我们有时也需要快速插入记录。为此,我们使用PostgreSQL内置的COPY
函数,类似于我们应用程序中的以下用法:
query = "COPY users(email) FROM STDIN WITH CSV"
values = users.map! do |user|
# Be wary of the types of the objects here, they matter.
# For instance if you set the id to a string it will error.
%Q{#{user["email"]}}
end.join("\n")
raw_connection.exec(query)
raw_connection.put_copy_data(values)
raw_connection.put_copy_end
这个操作在不到两分钟的时间内向数据库插入了约500,000条记录。如果我们添加更多字段,大约需要相同的时间。
PostgreSQL相比MySQL还有另外几个优点:
LIKE
语法如下:email ~ 'hotmail|gmail'
,NOT LIKE
则是email !~ 'hotmail|gmail'
。其中|
表示或。总之:PostgreSQL就像砖头和水泥,而MySQL则像乐高积木。选择适合自己的即可,这只是我的个人意见。
~
和!~
是正则表达式运算符。~~
是LIKE
的快捷方式。更多详情请参见http://www.postgresql.org/docs/8.4/static/functions-matching.html。使用raw_connection
调用COPY
是一个很方便的技巧。 - Jason Weathered我们在2007年初(或者是前一年?)出于几个原因转向了PostgreSQL。主要原因如下:
// John
虽然我自己没有转换,但MySQL缺乏事务模式更改曾经让我吃过几次亏,而Postgre显然支持这一点。
这将解决当你从sqlite的开发环境移动到MySQL服务器时遇到的那些令人讨厌的问题,并意识到你的迁移出了问题并且被留下了一半!(不,我没有在生产服务器上这样做,但它确实搞乱了我们的共享测试服务器!)