期待有一個數據庫查詢設置在一個類中的所有實例變量:從數據庫查詢中用行填充類屬性的最有效方法是什麼?
例子:
def populate(self, if):
#Perform mysql query
self._name = row['name']
self._email = row['email']
...
什麼是做到這一點的最快方法?或者這是不推薦的(有更好的方法)?
期待有一個數據庫查詢設置在一個類中的所有實例變量:從數據庫查詢中用行填充類屬性的最有效方法是什麼?
例子:
def populate(self, if):
#Perform mysql query
self._name = row['name']
self._email = row['email']
...
什麼是做到這一點的最快方法?或者這是不推薦的(有更好的方法)?
它使您的代碼具有最高的可讀性和可預測性,可以像這樣手動完成。這樣你就可以確切地知道存在哪些屬性以及哪些屬性不太容易。
您可以使用setattr
來自動執行這些操作。
一個相當不錯的方法是定義一個列表attributes = ['name', 'email'...]
作爲一個類屬性,然後做
for name in self.attributes:
setattr(self, "_" + name, row[name])
您也可以從查詢本身的屬性,但是這將取決於您的查詢的變化(特別是如果你正在使用SELECT *
或類似的東西)和你改變你的數據庫。
我注意到這些屬性都有前導下劃線。如果這是一個純粹的內部事物,請考慮一個屬性而不是查詢結果本身或存儲字典不會更好地滿足您的需求。通常,屬性應該是相當靜態的東西。
我聽到oursql是更好的MySQLdb的
看sqlalchemy這對蟒蛇最流行的數據庫抽象。
如果您真的喜歡活動記錄模式,那麼您可以將其放在頂層,稱爲elixir。
我使用sqlalchemy,因爲它是一個很好的數據庫抽象,並允許我切換數據庫。我在內存中使用sqlite進行測試,我可以使用sqlalchemy將其嵌入到我的代碼中。
感謝您的回覆。我使用了sqlalchemy,但由於我對數據庫可移植性不感興趣,它似乎對我所要做的事情有點重量級。 – ensnare 2010-03-30 05:10:11
謝謝,邁克。這非常有幫助。你對於查詢結果本身是否是字典的第二點到最後一點意味着什麼?你的意思是設置一個實例變量,如「信息」,並設置整個行等於? row = db.getRow(query) self._info = row 這樣的事情? – ensnare 2010-03-30 05:09:40
@ensnare,這正是我的意思。 – 2010-03-30 05:43:46
在user.id和user.info.id之間出現這種情況的差異會是奇怪的嗎?什麼是更清潔的解決方案?謝謝你的幫助。 – ensnare 2010-03-30 05:45:31