0

我研究过 Python 并了解 OOP 概念的工作原理。我的疑问是如何在具有 sql 交互的应用程序中实现..

假设我在 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()

类定义:

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

如何使用从 Employee 表中获取的详细信息来创建对象...我知道您不需要创建一个类来执行这个小操作..但我在考虑实际实现。

我需要逐记录处理。

4

2 回答 2

5

听起来您正在寻找对象关系映射器 (ORM)。这是一种将 SQL 数据库与面向对象的数据表示自动集成的方法,听起来非常适合您的用例。ORM 列表位于http://wiki.python.org/moin/HigherLevelDatabaseProgramming。一旦你设置了 ORM,你就可以giveraise在所有Emp对象上调用该方法。(顺便说一句,giveraise您定义的函数不是有效的 Python。)

于 2012-07-26T03:11:13.817 回答
0

正如 Abe 所提到的,已经有一些库可以为您执行这种映射(例如SQLAlchmyDjango包含的 ORM)。

不过要记住的一件事是,“实际实施”是主观的。对于小型应用程序和没有 ORM 经验的开发人员来说,快速了解 ORM 的一般概念可能会增加项目的时间,并会增加代码的细微错误。太多次有人会感到困惑,为什么像这样的事情需要永远使用 orm...

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

假设一张有 100 名员工的表,这可能会对数据库进行几次到 200 多次单独调用,具体取决于您设置 ORM 的方式。

不使用 OOP 可能是完全合理的,或者至少不是您所描述的方式。这是一个完全有效的对象:

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)

我绝不是试图敲击 ORM 或劝阻你不要使用它们。尤其是如果您只是在尝试一下,学习如何正确使用它们可以使它们成为有价值的工具。请记住,它们可能会很麻烦,特别是如果您以前从未使用过它们,并且如果您的应用程序足够小,请考虑有更简单的解决方案。

于 2012-07-26T03:55:09.183 回答