2012-07-26 67 views
0

我學習了Python,並理解了OOP概念是如何工作的。我的疑問是如何在具有sql交互的應用程序中實現..關於Python的基本邏輯OOP

假設我在SQL中包含僱員表,其中包含職位名稱,職位地址,職位薪資..現在,我需要給薪水提高對於我使用方法創建課程的所有員工。

我的數據庫邏輯

db = MySQLdb.connect("localhost","testuser","test123","TESTDB") 

cursor = db.cursor() 

sql = "Select * from Emp" 
cursor.execute(sql) 
results = cursor.fetchall() 

for row in results: 
    name = row[0] 
    address = row[1] 
    salary = row[2] 



db.close() 

類definiton:

Class Emp(): 
     def __init__(self,name,salary): 
      self.name = name 
      self.salary = salary 
     def giveraise(self): 
      self.salary = self.salary*1.4 

如何創建與Employee表中提取的詳細的對象......我知道你不需要創建一個類來執行這個小操作..但我想在實際執行的線。

我需要通過記錄處理記錄。

+5

如果您的目的是更新數據庫,您可能要避免嘗試製作自己的OO包裝。有很好的工具,比如django。 – 2012-07-26 03:11:33

+1

我同意django ORM是我用過的最好的... – 2012-07-26 03:14:00

回答

5

聽起來你正在尋找一個對象關係映射器(ORM)。這是一種將SQL數據庫與面向對象的數據自動集成的方式,對於您的用例來說聽起來很完美。 ORM列表在http://wiki.python.org/moin/HigherLevelDatabaseProgramming。一旦設置了ORM,就可以在所有的Emp對象上調用giveraise方法。 (順便說一句,您所定義的giveraise功能是不是有效的Python)。

0

正如安倍提到的,還有那些已經在做這種映射爲您庫(如SQLAlchmyDjango's包括ORM)。

但有一點需要記住的是,「實際實施」是主觀的。對於一個小型應用程序和一個沒有ORM經驗的開發者來說,加快ORM的總體思路可以增加項目的時間,併爲代碼添加微妙的錯誤。太多的時候會有人感到困惑,爲什麼這樣的事情有一個ORM需要永遠...

for employee in database.query(Employee).all(): 
    employee.give_raise(0.5) 

假設有100名員工的表,這樣可以使一些和200+個人調用的任何數據庫,根據你如何設置你的ORM。

不使用面向對象,或者至少不按照你所描述的方式,這可能是完全合理的。這是一個完全有效的對象:

class Workforce(object): 
    def __init__(self, sql_connection): 
     self.sql_connection = sql_connection 

    def give_raise(self, employee_id, raise_amount): 
     sql = 'UPDATE Employee SET Salary=Salary + ? WHERE ID = ?' 
     self.sql_connection.execute(sql, raise_amount, employee_id) 

絕不是我試圖敲ORMs或阻止你使用它們。特別是如果你只是在嘗試一下,學習如何正確使用它們可以使它們成爲有價值的工具。請記住,它們可能是一個麻煩,特別是如果您以前從未使用過它,並且考慮到如果您的應用程序足夠小,則有更簡單的解決方案。