2014-02-16 61 views
0

我用peewee作爲我的ORM的MySQL數據庫的外鍵。 我在我的計劃中有3個表格,一個用於設備,一個用於應用程序,另一個用於每個測試儀應用程序和測試應用程序的每個設備的結果。 的APPS表如下所示:CompositeKey在peewee與MySQL

package name | version name | version code |apk name 

3個第一列是我的主鍵,因爲我想在我的表中的每個版本,我想它很容易根據某些版本的代碼對應用進行過濾(版本號遞增在git \ svn中進行修訂,而版本名稱代表從開發分支中取得的版本本身)。 我的問題開始時,我希望有APPS表作爲我的測試表中的參考表,這意味着每個測試指的是APPS兩次,一次用於測試,一次用於測試應用程序。 我不確定在我的TESTS表中是否有3個字段的外鍵(這使得它爲6!)是一個好主意。

任何好的解決方案呢? 我嘗試添加_ID字段自動遞增爲「KEY」因此我有一個數字單場訪問,但ORM並沒有真正支持它,我有點咬緊我的牙試圖拉這一關。

是我的Db組織糟糕,或者我需要簡單地更換ORM?我認爲,如果沒有的ORM我可能把它關閉,很容易...

回答

1

選項:

  1. 定義在APPS表的自動遞增的主鍵。
  2. APPS表中定義複合唯一密鑰pkg,vervcodevcode列。
  3. 在子表 表中使用此表的主鍵值作爲FK參考。
+0

貌似對我來說是很好的解決方案!然而,任何想法如何我用peewee實現這種行爲? ,再次我可以實現我自己的解決方案,將工作在MYSQL BU我不能用peewee實現。 – codeScriber

+0

我仍然是Python的嬰兒。不能給出它的實現的想法。 –

+0

好吧,得到它,如果最差的情況發生,我可以使用:Apps.create_table(),它將創建自動遞增的regualr表,並且沒有contrain,然後是Apps.getdatabase()。execute('ALTER TABLE'APPS' ADD CONSTRAINT'limit_apps 'UNIQUE('pkg_name','version_name','version_code');然後我會接受你的答案,10倍! – codeScriber

0

這是一個非常晚的答案,但我想貢獻告訴peewee關於複合鍵的代碼,如下所示。當使用這種結構,Peewee不添加一個「id」一欄表:

class SillyTable(peewee.Model): 
    field1 = peewee.IntegerField(null=False) 
    field2 = peewee.IntegerField(null=False) 
    # Composite key, no "id" column needed. 
    class Meta: 
     primary_key = peewee.CompositeKey('field1','field2') 

我使用peewee V2.6.3和PyMySQL v0.6.3來訪問MySQL。