Maison  >  Article  >  développement back-end  >  Python implémente une méthode simple d'opération de virement bancaire

Python implémente une méthode simple d'opération de virement bancaire

高洛峰
高洛峰original
2017-03-07 16:00:552088parcourir

Avant-propos

Dans le processus de développement d'un système applicatif, quatre composants sont généralement requis de haut en bas : client - couche de logique métier - couche d'accès aux données - Base de données, dans lequel la couche d'accès aux données est une couche inférieure et une technologie de base. Et dans le développement réel, le fonctionnement de la base de données, c'est-à-dire la couche d'accès aux données, est imbriqué dans d'autres langages, qui constituent le cœur de la programmation. Cet article est orienté vers le langage python, c'est-à-dire l'utilisation de python pour faire fonctionner la base de données afin de mettre en œuvre des opérations simples de virement bancaire.

Outils

Python fournit l'API python DB pour unifier le fonctionnement de la base de données et standardiser l'interface d'accès à la base de données. Avant l'API python DB, le programme d'interface. était très déroutant. Différentes bases de données nécessitent différentes interfaces de fonctionnement, cette interface offre donc une grande commodité. Lors d'opérations spécifiques, nous devons faire fonctionner la base de données et d'autres codes python logiques, la connexion de l'objet de connexion à la base de données pour établir la connexion et le curseur de l'objet d'interaction de la base de données pour « transporter » les données. Un système robuste est indispensable pour la classe d'exceptions de base de données. L'ensemble du processus d'accès à la base de données est comme indiqué ci-dessous :

Python implémente une méthode simple dopération de virement bancaire

Ensuite, nous présenterons les deux objets principaux :

connexion : objet de connexion à la base de données, établir Client Python et connexion réseau à la base de données.
Méthode de création : MySQLdb.connect(), y compris les méthodes membres principales :
cursor() : Utiliser la connexion pour créer et renvoyer un curseur
commit() : Soumettre la transaction en cours
rollback() : Return Lancez la transaction en cours
close() pour fermer la connexion
cursor : objet curseur, utilisé pour exécuter des requêtes et obtenir des résultats Les principales méthodes supportées par l'objet curseur sont les suivantes :
execute(). : exécutez les instructions SQL et transférez les résultats de la base de données. Accédez au client
fetchone() : obtenez la ligne suivante du jeu de résultats
fetchmany(size) : obtenez la ligne de taille suivante du jeu de résultats
fetchall() : récupère toutes les lignes restantes du jeu de résultats
rowcount : le nombre de lignes de données renvoyées par l'exécution la plus récente
close() : ferme l'objet curseur
Un terme clé est mentionné dans la méthode ci-dessus : transaction. Qu'est-ce qu'une transaction ? Il s'agit d'une unité d'exécution de programme qui accède aux données et les met à jour. C'est un ensemble de nombreuses opérations et présente quatre caractéristiques :

Atomicité : Toutes les opérations incluses dans les choses sont effectuées ou aucune d'entre elles n'est effectuée
De manière cohérente. Persistance : Une transaction doit faire passer la base de données d'un état cohérent à un autre état de cohérence
Type d'isolement : L'exécution d'une transaction n'est pas interférée par d'autres transactions
Persistance : Une fois qu'une transaction est validée, ses modifications dans la base de données sont durables Les caractéristiques ci-dessus de la
transaction sont la clé pour nous de mener à bien l'opération de virement bancaire.

Mise en œuvre spécifique

Comment utilisons-nous les transactions en développement ?

Désactiver la validation automatique()
Terminer la transaction normalement : conn.commit(),
Terminer la transaction anormalement : conn.rollback()
Dans le système de virement bancaire, ce qui suit les exigences doivent être prises en compte : par exemple, lorsque A transfère de l'argent à B, lorsque M l'argent est retiré du compte de A, M l'argent doit être ajouté au compte de B. A ne peut pas être réduit mais B n'est pas ajouté, et B ne peut pas non plus être ajouté et. A n'est pas réduit. Bien entendu, le compte doit être valide, le montant de l'argent de M doit être supérieur au montant du compte de A. Par conséquent, dans la conception spécifique, la réduction de l'argent dans le compte A et l'augmentation de l'argent dans le compte B doivent être traitées comme une seule transaction, qui soit réussira en même temps, soit échouera ensemble. Selon cette exigence, écrivez le code. Voir github pour le code détaillé. La copie du code et la base de données sont les suivantes. Il y a deux comptes avec de l'argent respectivement 110 et 10. Lors de l'exécution du code, entrez 1, 2 100 (source_acctid, target_acctid, transfer_money) dans la colonne des paramètres.

Python implémente une méthode simple dopération de virement bancaire

La logique de l'ensemble du code est la suivante : connectez-vous d'abord à la base de données, puis exécutez la logique, puis déconnectez-vous de la base de données. La logique exécutée inclut la vérification si le. les comptes des deux parties au transfert sont valides et si le montant du transfert est valide s'il est supérieur au solde du compte du cédant, les montants des comptes remis aux deux parties au transfert changeront. Si la transaction se termine normalement, validez la modification dans la base de données, sinon annulez-la.

#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()

Résumé

Un système de virement bancaire simple peut être mis en œuvre en exploitant la base de données, donc lors du développement le système, nous devrions faire de notre mieux pour que l'ensemble du système ne soit pas seulement un épissage de plusieurs composants, mais également atteindre 1 1>2.

Pour plus d'articles sur la mise en œuvre d'une méthode simple d'opération de virement bancaire en Python, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn