2013-03-21 105 views
11

我想學習如何使用mysql與peewee。爲什麼包含'id'列的peewee放入mysql select查詢中?

我有一個現有的數據庫與現有表的MySQL服務器。該表目前是空的(我現在只是測試)。

>>> db = MySQLDatabase('nhl', user='root', passwd='blahblah') 
>>> db.connect() 


>>> class schedule(Model): 
...  date = DateField() 
...  team = CharField() 
...  class Meta: 
...    database = db 

>>> test = schedule.select() 
>>> test 
<class '__main__.schedule'> SELECT t1.`id`, t1.`date`, t1.`team` FROM `nhl` AS t1 [] 
>>> test.get() 

我得到以下錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/site-packages/peewee.py", line 1408, in get 
    return clone.execute().next() 
    File "/usr/lib/python2.6/site-packages/peewee.py", line 1437, in execute 
    self._qr = QueryResultWrapper(self.model_class, self._execute(), query_meta) 
    File "/usr/lib/python2.6/site-packages/peewee.py", line 1232, in _execute 
    return self.database.execute_sql(sql, params, self.require_commit) 
    File "/usr/lib/python2.6/site-packages/peewee.py", line 1602, in execute_sql 
    res = cursor.execute(sql, params or()) 
    File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 201, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.OperationalError: (1054, "Unknown column 't1.id' in 'field list'") 

爲什麼peewee添加 'ID' 列到選擇查詢?數據庫中已存在的表中沒有id列。我只想使用現有的表格,而不是依賴於每次我想與數據庫進行交互的peewee都要創建一個。這是我相信錯誤的地方。

查詢的結果應該是空的,因爲表是空的,但由於我正在學習,我只是想嘗試一下代碼。我感謝您的幫助。

編輯

基於由Wooble和弗朗西斯很有幫助的回答,我來想知道是否甚至是有道理的,我使用peewee或其他類似ORM SQLAlchemy的。使用ORM而不是僅使用MySQLdb在python中運行直接查詢有什麼好處?

這是我希望做:

從各種web服務器 - 自動下載數據。大部分數據都是xls或csv格式。我可以使用xlrd軟件包將xls轉換爲csv。

- 在插入/批量插入到mysql數據庫表之前解析/處理列表對象中的數據。

- 運行復雜的查詢將數據從mysql導出到python中導入適當的數據結構化(列舉例如)各種統計計算,在python而不是mysql中更容易完成。任何可以在mysql中完成的事情都將在那裏完成,但我可能會在python中運行復雜的迴歸。

- 對從查詢中檢索到的數據運行各種圖形包。其中一些可能包括使用ggplot2軟件包(來自R-project),這是一個高級圖形軟件包。所以我會涉及一些R/Python集成。

鑑於上述情況,我最好花費幾個小時學習ORM/Peewee/SQLAlchemy或堅持使用MySQLdb直接進行mysql查詢?

回答

15

最簡單的活動記錄模式ORM需要一個id列來跟蹤對象標識。 PeeWee似乎是其中之一(或者至少我不知道有任何方法可以使用而不是使用一個id)。如果不更改表格,您可能無法使用PeeWee。

無論如何,你現有的表似乎並沒有很好的設計,因爲它似乎缺少一個鍵或複合鍵。每個表都應該有一個關鍵屬性 - 否則不可能將一行與另一行區分開來。

如果這些列中的一個是主鍵,嘗試添加一個primary_key=True參數作爲解釋in the docs concerning non-integer primary keys

date = DateField(primary_key=True) 

請注意,我不知道,如果PeeWee將被打破,主鍵未命名id

您應該調查SQLAlchemy,它使用數據映射器模式。它更復雜,但也更強大。它不會對你的SQL表設計施加任何限制,事實上它可以在大多數情況下自動反映你的表結構和相互關係。 (可能不如MySQL,因爲外鍵關係在默認表引擎中是不可見的。)最重要的是,對於你來說,它可以處理缺少密鑰的表。

+1

謝謝你的詳細回覆。事實證明,數據庫中的現有表具有PRIMARY KEY(日期)。我是否需要按照Wooble的指示使用pwiz將這些信息提供給peewee?感謝幫助。 – codingknob 2013-03-22 01:11:19

+0

你不需要* - pwiz只是一個代碼生成器,不會做你自己無法做的事情。可能只是包含'primary_key = True'參數[在描述非整數主鍵的文檔中](http://peewee.readthedocs.org/en/latest/peewee/models.html#non-integer-primary-keys )。 – 2013-03-22 01:35:14

+0

我正在調查SQLAlchemy,因爲peewee將來不會做我想做的事情。 – codingknob 2013-03-27 01:19:54

0

您需要我們peewee的create table方法來創建實際的數據庫表,然後才能調用select(),這將在表中創建一個id列。

+0

請問在我的實際數據庫中創建表嗎?我已經在數據庫中擁有該表了。我很困惑,因爲peewee文檔對新手來說不是很友好。 – codingknob 2013-03-21 22:40:56

+0

另外 - 是否有一步一步的指導/例子如何做一些事情,如a)連接到數據庫,b)將存儲在列表對象中的記錄插入到表中,c)執行復雜的查詢(連接,分組等) 。)和d)將查詢結果存儲在一個python列表對象中,然後可以將其用於其他目的。 peewee文檔沒有正確解釋軟件包的最終用例,以及如何遍歷我所描述的從a到d的工作流程。 – codingknob 2013-03-21 23:06:53

+0

http://peewee.readthedocs.org/en/latest/peewee/example.html。 '每個模型都有一個create_table()類方法,它在數據庫中運行CREATE TABLE語句。它將創建表,包括所有列,外鍵約束和索引。通常情況下,只要添加一個新模型,您只能進行一次。「這個軟件包如何不能用於現有的表格?我錯過了什麼嗎?感謝幫助。 – codingknob 2013-03-21 23:50:36

9

如果你的主鍵列名是不是「身份證」等你應該更多的字段添加到表模型類:

class Table(BaseModel): 
    id_field = PrimaryKeyField() 

會告訴你的腳本,你的表有存儲在名爲列主鍵'id_field',該列是啓用了自動增量的INT類型。 Here是描述peewee字段類型的文檔。

如果你想在主鍵字段更多的控制,已經由弗朗西斯阿維拉指出,你應該在創建場時使用primary_key = True參數:

class Table(BaseModel): 
    id_field = CharField(primary_key=True) 

this link非整數主鍵文檔

+3

作者peewee在這裏 - 你的答案是現貨,謝謝! – coleifer 2013-04-20 17:11:15

3

您必須爲此模型提供primary_key字段。 如果您的表沒有單個primary_key字段(與我的類似),Meta中定義的CompositeKey將有所幫助。

primary_key = peewee.CompositeKey('date', 'team') 
+0

我已經更新了答案,現在已經很清楚了。剛發現了一種製作CompositeKey的方法。 – ySJ 2014-05-26 06:54:47