我正在尋找一種方式來轉儲與Python & Peewee提出到Excel文件的MySQL查詢,包括數據庫列標題的結果。我希望導出的內容以與數據庫中的列幾乎相同的順序排列。此外,我想要一種方法可以跨多個類似的數據庫,可能有稍微不同的領域。爲了澄清,一個數據庫可能有一個包含「User,PasswordHash,DOB,[...]」的用戶表,而另一個數據庫則有「User,PasswordHash,Name,DOB,[...]」。
的問題
我的主要問題越來越列在一個有序的方式進行標頭。迄今爲止所有的嘗試都導致了無序的結果,並且所有這些都不那麼優雅。其次,我的方法到目前爲止導致了代碼,我會(個人)不願意維護,我知道這是一個不好的跡象。
工作至今
目前,我已經使用Peewee的pwiz.py腳本生成每個目標數據庫中預先存在的數據庫表的模型,然後去和輸入的所有主鍵和外鍵。這些關係已經建立起來了,一些簡短的測試表明他們正確地關聯着。
代碼:我已經成功地得到了列標題出來的類似的東西:
for i, column in enumerate(User._meta.get_field_names()):
ws.cell(row=0,column=i).value = column
如前所述,這是無序的。另外,這樣做會迫使我按照
getattr(some_object, title)
的方法做一些事情來相應地動態填充字段。
思想和可能的解決方案
手動寫出來的秩序,我想在一個數組的東西,並利用它來進行循環,通過和填充數據。這個優點是非常嚴格/粒度控制。缺點是我需要爲每個數據庫指定這個。
爲所有可能遇到的字段創建(無論是手動還是通過方法)帶有相關加權值的字段哈希,然後編寫一個方法根據權重對「_meta.get_field_names()」進行排序。這樣做的缺點是列的順序可能不是100%,例如名稱在一個數據庫中出現在DOB之前,而在另一個數據庫之後。
隨意告訴我,我做這一切都是錯誤的或建議完全不同的方式做到這一點,我都耳朵。我對Python和Peewee(實際上是一般的ORM)非常陌生。我可以切換回Perl,並通過DBI查詢數據庫,幾乎沒有麻煩。然而,對於excel來說,圖書館會給我帶來很多問題,我想借此機會擴展我的知識面。
我想這是儘可能接近我做我想做的事情。我將不得不重新審視我的思維過程,並查看處理此問題的其他方法。感謝您的幫助! – Rejected
我猜所有人的coleifer都會知道,但作爲對其他人的一個提示,'get_field_names'現在似乎是從'get_sorted_fields'獲取字段名的別名(來自[ModelOptions]的定義(https://github.com/ coleifer/peewee/blob/master/peewee.py)),所以順序應該是正確的。 – beardc
請注意,在最新版本的peewee中,您需要使用'User._meta.sorted_fields'或'User._meta.sorted_field_names' – Ian