簡體   English   中英

rails3 bigint 主鍵

[英]rails3 bigint primary key

我想在 Rails 3 下創建一個bigint (或string或任何非int )類型的主鍵字段。

我有一個給定的數據結構,例如:

things
------
id bigint primary_key
name char(32)

我目前正在嘗試推動的方法:

create_table :things, :id => false do |t| # That prevents the creation of (id int) PK
  t.integer :id, :limit => 8 # That makes the column type bigint
  t.string :name, :limit => 32
  t.primary_key :id # This is perfectly ignored :-(
end

列類型將是正確的,但 sqlite3 不會出現主鍵選項,我懷疑 MySQL 也是這種情況。

我有同樣的問題。 我認為最簡單的方法是一張桌子

accounts 
id bigint primary key 
name char 

create_table :accounts do |t|
t.string :name
end
change_column :accounts, :id , "bigint NOT NULL AUTO_INCREMENT"

對於 MySQL,您可以使用“SERIAL”,它是“BIGINT UNSIGNED NOT NULL AUTO_INCREMENT”的別名

class ChangeUserIdToBigint < ActiveRecord::Migration
  def change
    change_column :users, :id, 'SERIAL'
  end
end

如果我自己不久前在這里找到了答案: Using Rails, how can I set my primary key to not be an integer-typed column?

您需要設置 primary_key: false 然后在執行遷移之前使用自定義語句。

編輯 1:您需要檢查數據庫文檔以執行確切的查詢。 它作為常規 SQL 語句執行,並且需要特定於數據庫。 我提到的問題中的示例是 Postgre SQL。 如果您使用的是 MySQL,您可能需要更改它。

對於那些來到這里(就像我所做的那樣)努力弄清楚如何制作使用bigint而不是int的自定義id列的人,我沒有意識到對於 Rails 5.1 及更高版本, bigint是默認值輸入id

https://github.com/rails/rails/pull/26266

skalgirou 的回答很好,但更改不會反映在 schema.rb 中。 所以像db:schema:loaddb:test:clone這樣的任務不會創建相同的數據庫結構。

所需的解決方法是增強db:schema:load和 db:test:clone rake 任務,如下所述: http://www.lshift.net/blog/2013/09/30/chang-the-primary-key-type -in-ruby-on-rails-models/

這是我基於該解決方法使用的:

namespace :my_app do
  namespace :db do
    task :after_schema_load_and_db_test_clone => :environment do
    puts 'Changing primary key for :my_table'
    query = 'ALTER TABLE <my_table> CHANGE id id bigint DEFAULT NULL auto_increment'
    ActiveRecord::Base.connection.execute(query)
  end
end


Rake::Task['db:schema:load'].enhance do
  ::Rake::Task['my_app:db:after_schema_load_and_db_test_clone'].invoke
end

Rake::Task['db:test:clone'].enhance do
  ::Rake::Task['my_app:db:after_schema_load_and_db_test_clone'].invoke
end

如果要轉換 Postgres 中的所有表,則需要運行此代碼

class ConvertIntToBigint < ActiveRecord::Migration[5.1]
  def up
    query = <<-SQL
      SELECT tablename AS "tablename"
      FROM pg_tables
      WHERE schemaname = 'public';
    SQL
    connection.execute(query).each do |element|
      if column_exists?(element['tablename'], :id, :integer)
        change_table(element['tablename']) {|t| t.change :id, :bigint }
      end
    end
  end

  def down
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM