gpt4 book ai didi

mysql - Rails 4 - 从 SQLite 切换到 MySQL - 无法添加外键约束

转载 作者:行者123 更新时间:2023-11-29 02:52:16 36 4
gpt4 key购买 nike

长话短说,我开始编写一个无法投入生产的应用程序,但我的老板喜欢它并让我部署它。现在我必须从 SQLite 切换到 MySQL 才能在生产服务器上获取应用程序。

我添加了 gem:gem 'mysql2', '~> 0.3.20',执行了 bundle install,并更新了 database.yml:

default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password:
host: localhost

development:
<<: *default
database: umc2_dev

test:
<<: *default
database: umc2_test

production:
<<: *default
database: umc2
username: umc2
password: <%= ENV['PRODUCTION_DATABASE_PASSWORD'] %>

迁移不会做任何复杂的事情。一切看起来像这样:

create_table :checkins do |t|
t.string :public_ip
t.string :private_ip
t.string :ubermix_version
t.string :kernel
t.string :architecture
t.integer :battery_capacity
t.integer :system_free
t.integer :home_free
t.integer :user_free
t.references :device, index: true, foreign_key: true
t.references :location, index: true, foreign_key: true

t.timestamps null: false
end

当我迁移数据库时,控制台会显示:

Mysql2::Error: Can't create table 'umc2.#sql-4e7_10' (errno: 150): \
ALTER TABLE `checkins` ADD CONSTRAINT `fk_rails_ba93b88497`

几个小时以来,我一直在努力解决这个问题。我错过了什么吗?我是否无意中引入了某种存储引擎问题? MySQL 5.7.10 应该默认为 InnoDB,对吧?

最佳答案

当我运行 SQLite 时,我使用了这样的资源生成器:rails g resource checkin device:references。当您将 references 类型传递给生成器时,它会自动将 index: true, foreign_key: true 附加到迁移文件中的相应行。在使用 MySQL 创建引用表之前,父表必须存在,但是如果父表不存在,SQLite 不会报错。

我不得不编写额外的迁移,将引用列添加到 checkin 表中。我认为您可以删除 foreign_key: true 位而不影响 ActiveRecord 关系,但我不确定这是否是首选解决方案。

关于mysql - Rails 4 - 从 SQLite 切换到 MySQL - 无法添加外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34443884/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com