Mysql2 ::错误:表'table_name'不存在:显示来自`table_name`的完整字段

vie*_*nni 6 mysql ruby-on-rails ruby-on-rails-5.1

在提交问题之前,我已尝试使用每个stackoverflow.com类似的参数.但我没有发现问题.我正在使用rails 5.1.1和mysql 5.7我有一个名为的迁移类:

class CreateCompanies < ActiveRecord::Migration[5.1]
  def change
    create_table :companies do |t|
    t.string :ragione_sociale
    t.references :forma_giuridica, foreign_key: true
    t.string :telefono_fisso
    t.string :fax
    t.string :pec
    t.string :mail
    t.string :web_site
    t.string :cellulare_emergenze
    t.string :via_legale
    t.string :n_civico_legale
    t.string :citta_legale
    t.string :cap_legale
    t.string :provincia_legale
    t.string :regione_legale
    t.string :via_operativa
    t.string :n_civico_operativa
    t.string :citta_operativa
    t.string :cap_operativa
    t.string :provincia_operativa
    t.string :regione_operativa
    t.string :pi
    t.string :cf
    t.string :ateco_primo
    t.string :ateco_secondo
    t.string :ateco_altro
    t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我有一个空模型calledny.rb和一个叫做的控制器companies_controller.rb.

database.yml是:

# MySQL. Versions 5.1.10 and up are supported.
#
# Install the MySQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.7/en/old-client.html
#
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: Pipipopo09
  host: localhost
  port: 3300

development:
  <<: *default
  database: Pluto_Demetra_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: Pluto_Demetra_test

# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
#   production:
#     url: <%= ENV['DATABASE_URL'] %>
#
production:
  <<: *default
  database: Pluto_Demetra_production
  username: Pluto_Demetra
  password: <%= ENV['PLUTO_DEMETRA_DATABASE_PASSWORD'] %>
Run Code Online (Sandbox Code Playgroud)

运行时rails db:migrate我有以下错误:

== 20170621125622 CreateCompanies: migrating ==================================
-- create_table(:companies)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'pluto_demetra_development.companies' doesn't exist: SHOW FULL FIELDS FROM `companies`
C:/Users/gvieri.BSNSTRATEGIES/SitiRuby/Pluto_Demetra/db/migrate/20170621125622_create_companies.rb:3:in `change'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'pluto_demetra_development.companies' doesn't exist: SHOW FULL FIELDS FROM `companies`
C:/Users/gvieri.BSNSTRATEGIES/SitiRuby/Pluto_Demetra/db/migrate/20170621125622_create_companies.rb:3:in `change'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Mysql2::Error: Table 'pluto_demetra_development.companies' doesn't exist
C:/Users/gvieri.BSNSTRATEGIES/SitiRuby/Pluto_Demetra/db/migrate/20170621125622_create_companies.rb:3:in `change'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Mysql2::Error: Cannot add foreign key constraint
C:/Users/gvieri.BSNSTRATEGIES/SitiRuby/Pluto_Demetra/db/migrate/20170621125622_create_companies.rb:3:in `change'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud)

我可以帮助我.提前致谢.

Sin*_*Liu 10

它可能是由ActiveRecord :: Migration [5.1]引起的.如果要将外键添加到companies表中,迁移首先会读取表,但它不存在.

将迁移更改为5.0适用于我.

class CreateCompanies < ActiveRecord::Migration[5.0]
end
Run Code Online (Sandbox Code Playgroud)

或者首先删除外部选项,然后手动添加外键:

class CreateCompanies < ActiveRecord::Migration[5.1]
  def change
    create_table :companies do |t|
      t.string :ragione_sociale
      t.references :forma_giuridica # without :foreign_key option
      # ...
    end

    # add foreign key here
    add_reference :companies, :forma_giuridica
  end
end
Run Code Online (Sandbox Code Playgroud)


小智 4

::Migration[5.0] 使用主键 int(11)

::Migration[5.1] 使用主键 bigint(20)

最常见的原因是创建外键时,引用字段和外键字段都需要匹配:

  • 引擎应该是相同的,例如InnoDB
  • 数据类型应该相同,并且长度相同。
    例如 VARCHAR(20) 或 INT(10) UNSIGNED
  • 排序规则应该是相同的。例如utf8
  • 唯一- 外键应引用引用表中唯一(通常是私有)的字段。