新手问询:将Rails应用连接已有MySQL数据库及替代mysqli功能方法
嘿,作为刚入坑Rails的新手,能理解你想把PHP应用迁移过来还保住原有数据的需求——我当初从PHP转Rails的时候也纠结过类似的点!下面一步步给你说清楚:
第一步:配置Rails连接你的现有MySQL数据库
Rails不像PHP那样用mysqli手动写连接代码,它通过config/database.yml文件统一管理数据库连接,这有点像你在PHP里写mysqli_connect的参数,但更规整。
打开这个文件,把对应的环境(比如development)配置改成你的现有数据库信息:
development: adapter: mysql2 database: 你的现有数据库名 username: 数据库用户名 password: 数据库密码 host: localhost # 或者你的数据库服务器地址 encoding: utf8mb4 # 和PHP那边保持字符集一致,避免乱码
记得先确保Gemfile里有mysql2这个gem,没有的话加上,然后跑bundle install安装。
第二步:Rails里类似mysqli的功能
PHP的mysqli是偏底层的数据库操作API,Rails默认用ActiveRecord这个ORM(对象关系映射)来操作数据库,这是更上层的封装,但如果你需要像mysqli那样写原生SQL或者做底层操作,完全可以:
1. 执行原生SQL查询(类似mysqli_query)
如果你想直接跑原生SELECT语句,可以用ActiveRecord::Base.connection.execute,比如:
results = ActiveRecord::Base.connection.execute("SELECT * FROM users WHERE id = 1") # 遍历结果 results.each do |row| puts row["username"] end
或者用find_by_sql,它会把结果转换成ActiveRecord对象,更贴合Rails的用法:
users = User.find_by_sql("SELECT * FROM users WHERE email LIKE '%@example.com'") users.each do |user| puts user.name end
2. 执行写操作(类似mysqli_query做INSERT/UPDATE/DELETE)
同样用connection.execute:
# 插入数据 ActiveRecord::Base.connection.execute("INSERT INTO posts (title, content) VALUES ('Rails入门', '这是我的第一篇Rails文章')") # 更新数据 ActiveRecord::Base.connection.execute("UPDATE users SET last_login = NOW() WHERE id = 1")
3. 预处理语句(类似mysqli_prepare)
Rails也支持预处理,防止SQL注入,比如:
ActiveRecord::Base.connection.execute( "SELECT * FROM users WHERE id = ?", [current_user_id] )
这里的?会被后面数组里的参数安全替换,和mysqli的预处理一样靠谱。
第三步:保留原有数据的小技巧
因为你要复用现有数据库,别随便跑rails db:migrate(它会创建新表或者修改结构),建议先跑:
rails db:schema:dump
这个命令会读取你现有数据库的结构,生成db/schema.rb文件,这样ActiveRecord就能识别所有现有表了。之后如果需要修改表结构,再写迁移文件,而且迁移的时候一定要注意备份数据!
总的来说,Rails的数据库操作比mysqli更灵活,既有上层的ORM简化开发,也支持底层原生操作满足你的习惯。
内容的提问来源于stack exchange,提问作者Rishabh Shukla

