2012-05-28 37 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

谢谢!我以前没有想过使用测试作为文档。我一定会在下次询问之前检查他们 –