我想學習rails,並且遇到了一些問題。如何進行數據庫遷移創建具有特定屬性的表?
我有一箇舊的sqlite3數據庫,它有一個Accounts
表,我之前用一些GUI程序做了。我想看看是否可以通過數據庫遷移重新創建該表。
這裏是什麼我以前(我的目標)的說明:
-- desired
CREATE TABLE "accounts" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL DEFAULT (0),
"username" TEXT NOT NULL COLLATE NOCASE,
"password_hash" BLOB NOT NULL,
"creation_time" INTEGER NOT NULL DEFAULT(strftime('%s', 'now')),
"expiration_time" INTEGER NOT NULL DEFAULT(strftime('%s', 'now') + 2592000)
)
我當前的遷移代碼將無法正常工作。我在某處讀到我可以使用:options
來指定ActiveRecord無法封裝的東西,但我可能做錯了。當我使用:default => Time.now.to_i
時,它只是硬編碼了一些默認值;當我使用:default => "strftime('%s', 'now')"
時,它根本不起作用。
class CreateAccounts < ActiveRecord::Migration
def change
create_table :accounts do |t|
t.column 'username', :text, :null => false, :options => 'COLLATE NOCASE'
t.column 'password_hash', :binary, :null => false
t.column 'creation_time', :integer, :null => false, :options => "DEFAULT(strftime('%s', 'now'))"
t.column 'expiration_time', :integer, :null => false, :options => "DEFAULT(strftime('%s', 'now') + 2592000)"
end
end
end
我最終得到了下表。它看起來像所有的:option
值都被忽略。
-- what i actually get
CREATE TABLE "accounts" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"username" text NOT NULL,
"password_hash" blob NOT NULL,
"creation_time" integer NOT NULL,
"expiration_time" integer NOT NULL
)
如何在創建列時指定SQL位?任何幫助將非常感激。
我試着用':默認=>「的strftime(‘%s’的,‘現在’ ))''你建議的東西,但它只是結果爲0. ''creation_time「integer DEFAULT 0 NOT NULL' –
我的猜測是,它會將所有默認值傳遞給列類型。你可能只需要爲那個使用execute。 – sgrif