0

私は Python を学び、OOP の概念がどのように機能するかを理解しています。私が持っている疑問は、SQL相互作用を持つアプリケーションに実装する方法です..

Emp name、Emp address、Emp Salary を含む従業員テーブルが 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 の一般的な考え方を理解することで、プロジェクトに時間がかかり、コードに微妙なエラーが発生する可能性があります。なぜこのようなことがオームで永遠にかかるのか、誰かが混乱することは何度もあります...

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

100 人の従業員がいるテーブルを想定すると、ORM の設定方法に応じて、データベースに対して数回から 200 回以上の呼び出しが発生する可能性があります。

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 に答える