2012-05-28 42 views
4

我只是爲了好玩而讓自己成爲一個臉譜/嘰嘰喳喳組合的東西,但我並不是100%確定使用JDBC東西的一些語義。我不確定如何將字段設置爲外鍵或如何限制varchar字段中的字符數量。Postgres和Clojure中的外鍵和字符限制JDBC

我的代碼(帶註釋顯示在我需要幫助)如下

(ns twitface.models.migration 
    (:require [clojure.java.jdbc :as sql])) 

(defn create-tables [] 
    (sql/with-connection (System/getenv "DATABASE_URL") 
    (do 
     (sql/create-table :users 
         [:id :serial "PRIMARY KEY"] 
         [:email :varchar "NOT NULL"] 
         [:password :varchar "NOT_NULL"] 
         [:full-name :varchar "NOT NULL"] 
         [:pref-name :varchar] 
         [:created_at :timestamp "NOT NULL" "DEFAULT CURRENT_TIMESTAMP"]) 
     (sql/create-table :relations 
         [:id :serial "PRIMARY KEY"] 
         [:relating-user :numeric] ; foreign key 
         [:related-user :numeric] ; foreign key 
         [:status :varchar]) 
     (sql/create-table :posts 
         [:id :serial "PRIMARY KEY"] 
         [:user :numeric "NOT NULL"] ; foreign key 
         [:destination-user :numeric "NOT NULL"] ; foreign key 
         [:message :varchar "NOT NULL"] ; 180 char limit 
         [:created_at :timestamp "NOT NULL" "DEFAULT CURRENT_TIMESTAMP"]) 
     (sql/create-table :comments 
         [:id :serial "PRIMARY KEY"] 
         [:user :numeric "NOT NULL"] ; foreign key 
         [:message :varchar "NOT NULL"] ; 180 char limit 
         [:created_at :timestamp "NOT NULL" "DEFAULT CURRENT_TIMESTAMP"])))) 

任何幫助,將不勝感激!提前致謝!

回答

3

,使用references爲SQL:

(defn create-tables [] 
    (sql/with-connection (System/getenv "DATABASE_URL") 
    (do 
     (sql/create-table :users 
         [:id :serial "PRIMARY KEY"] 
         [:email "varchar(50)" "NOT NULL"] 
         [:password "varchar(30)" "NOT NULL"]) 
     (sql/create-table :relations 
         [:id :serial "PRIMARY KEY"] 
         [:related_user :serial "references users (id)"] 
         [:status "varchar(10)"])))) 
+0

謝謝!一個小問題:您對related_user字段使用了串行數據類型。這不會導致它只選擇它自己的號碼嗎?或者是因爲它引用了另一個序列字段,它就是這樣嗎? –

+0

是的,請查看postgresql文檔:http://www.postgresql.org/docs/8.3/static/tutorial-fk.html –

+0

感謝您的幫助! –

3

如果您沒有找到文檔,請查看項目中包含的測試,以及是否無法檢查源代碼 - 關於使用開源代碼的最佳方法。我想看看在測試後發現,您可以使用VARCHAR(180)而不是使用:varchar指定列的極限,同樣可以使用正常的SQL構造爲外鍵指定外鍵

+0

謝謝!我以前沒有想過使用測試作爲文檔。我一定會在下次詢問之前檢查他們 –