まえがき
アプリケーション システムの開発プロセスでは、通常、上から順に、クライアント、ビジネス ロジック層、データ アクセス層、データベースの 4 つのコンポーネントが必要になります。このうち、データ アクセス層が最下位のコア層となります。 。 テクノロジー。また、実際の開発では、データベースの操作、つまりデータアクセス層が他の言語でネストされており、これがプログラミングの核心となります。この記事は、Python 言語、つまり、Python を介してデータベースを操作して単純な銀行振込操作を実装することを目的としています。
ツール
Python は、データベースの操作を統一し、データベースにアクセスするためのインターフェイスを標準化するための Python DB API を提供します。Python DB API が登場する前は、インターフェイス プログラムはデータベースごとに異なる操作インターフェイスを必要とするため、これが非常に複雑でした。インターフェースは非常に便利です。特定の操作では、データベースとその他の論理 Python コード、接続を確立するためのデータベース接続オブジェクトの接続、およびデータを「転送」するためのデータベース インタラクション オブジェクトのカーソルを操作する必要があります。データベース例外クラス Exceptions には、堅牢なシステムが不可欠です。 。データベース アクセス プロセス全体は以下に示すとおりです:
次に、2 つの主要なオブジェクトを紹介します:
connection: Python クライアントとデータベース間のネットワーク接続を確立するデータベース接続オブジェクト。
作成メソッド: MySQLdb.connect() (メインメンバーメソッドを含む):
cursor(): 接続を使用してカーソルを作成し、返す
commit(): 現在のトランザクションを送信する
rollback(): 現在のトランザクションをロールバックする
close () 接続
cursor: クエリを実行して結果を取得するために使用されるカーソル オブジェクト。カーソル オブジェクトでサポートされている主なメソッドは次のとおりです。
execute(): SQL ステートメントを実行し、データベースからクライアントに結果を取得します。
fetchone() : 結果セットの一番下を取得します 1 行
fetchmany(size): 結果セットの次のサイズの行を取得します
fetchall(): 結果セット内の残りのすべての行を取得します
rowcount: によって返されるデータの行数最新の実行
close(): カーソル オブジェクトを閉じます
上記のメソッドで重要な用語が説明されています: トランザクションとは何ですか?これは、データにアクセスして更新するプログラムの実行単位であり、多くの操作の集まりであり、次の 4 つの特性があります:
原子性: モノに含まれるすべての操作が完了するか、いずれも完了しないかのいずれかです
一貫性: トランザクションは次のとおりでなければなりませんデータベースを整合性状態から別の整合性状態に変更します
分離タイプ: トランザクションの実行は他のトランザクションによって干渉されません
永続性: トランザクションが送信されると、データベースへの変更は永続的になります
上記の特性は、銀行振込業務の鍵となるのは取引です。
具体的な実装
開発でトランザクションをどのように使用するか?
自動 commit() をオフにする
トランザクションの正常終了: conn.commit()、
トランザクションの異常終了: conn.rollback()
銀行振込システムでは、次のことを考慮する必要があります。たとえば、A A が B にお金を送金します。M 個のお金が減ったとき、B の口座にはさらに M 個のお金がなければなりません。A がお金を減らしても B が追加しなかったということはありえません。また、B がお金を追加して追加したこともあり得ません。もちろん、A はまだ減額していません。口座は有効であり、金額 M は口座 A の金額より大きくなければなりません。したがって、具体的な設計では、アカウント A のお金の減少とアカウント B のお金の増加を 1 つのトランザクションとして扱う必要があり、同時に成功するか一緒に失敗します。この要件に従って、コードを記述します。コードのコピーとデータベースは次のとおりです。コードを実行するときは、それぞれ 1、2,100 を入力します。 transfer_money)をパラメータ列に入力します。
コード全体のロジックは次のとおりです。最初にデータベースに接続し、次にロジックを実行し、次にデータベース接続を切断します。実行されるロジックには、転送の両当事者のアカウントが有効であるかどうかの確認が含まれます。送金金額が送金者の口座残高を超えているかどうか。送金の両当事者の口座残高が変更されているかどうか。トランザクションが正常に終了した場合は、変更をデータベースにコミットします。それ以外の場合は、変更をロールバックします。
#coding:utf-8 import sys import MySQLdb class TransferMoney(): def __init__(self, conn): self.conn = conn def transfer(self, src, target, money): try: self.check_acct_available(src) self.check_acct_available(target) self.has_enough_money(src, money) self.reduce_money(src, money) self.add_money(target, money) self.conn.commit() except Exception as e: print e self.conn.rollback() def reduce_money(self, src, money): cursor = self.conn.cursor() try: sql = "update account set money = money - %s where acctid = %s" %(money, src) cursor.execute(sql) print "reduce_money: " + sql #rs = cursor.fetchall() if cursor.rowcount != 1: raise Exception("the account reduce money fail") finally: cursor.close() def add_money(self, target, money): cursor = self.conn.cursor() try: sql = "update account set money = money + %s where acctid = %s" %(money, target) cursor.execute(sql) print "add_money: " + sql #rs = cursor.fetchall() if cursor.rowcount != 1: raise Exception("the account add money fail") finally: cursor.close() def check_acct_available(self, accit): cursor = self.conn.cursor() try: sql = "select * from account where acctid = %s" %accit cursor.execute(sql) print "check_acct_available: " + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception("the account %s is not exist" %accit) finally: cursor.close() def has_enough_money(self, src, money): cursor = self.conn.cursor() try: sql = "select * from account where acctid = %s and money >= %s " %(src, money) cursor.execute(sql) print "has_enough_money: " + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception("the account does not have enough money") finally: cursor.close() if __name__ == "__main__": source_acctid = sys.argv[1] target_acctid = sys.argv[2] money = sys.argv[3] conn = MySQLdb.connect( host = "127.0.0.1", user = '******', passwd = '******', port = 3306, db = '******' ) tr_money = TransferMoney(conn) try: tr_money.transfer(source_acctid, target_acctid, money) except Exception as e: print e finally: conn.close()
まとめ
簡単な銀行振込システムはデータベースを操作するだけで実現できるので、システムを開発する際は複数のコンポーネントだけでなくシステム全体ができるように最善を尽くすべきです スプライシングは1+を達成する必要があります1>2.
Python での簡単な銀行振込操作メソッドの実装に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。