ホームページ  >  記事  >  バックエンド開発  >  MySQL を操作して銀行振込操作をシミュレートする Python の簡単な例

MySQL を操作して銀行振込操作をシミュレートする Python の簡単な例

黄舟
黄舟オリジナル
2017-10-04 09:25:462378ブラウズ

この記事では、簡単な銀行振込操作をシミュレートするために MySQL を操作するための Python を主に紹介します。 pip install インストールパッケージ

2. Python で一般的なデータベースプログラムを書くための API 仕様 (1)、データベース接続オブジェクト接続、Python クライアントとデータベース間のネットワーク接続を確立します、作成メソッドは MySQLdb.Connect (パラメータ)

パラメータは次の 6 つです: Host (MySQL サーバーのアドレス、通常は 127.0.0.1) PORT (MySQL サーバーのポート番号)

User (ユーザー名)

PASSWD (パスワード)

DB (データベース名)

charset 接続メソッド:cursor() は接続を使用し、カーソルを返します

Close() 接続を閉じます

(2)、データベース カーソル オブジェクト カーソル、クエリの実行と結果の取得に使用されます

メソッド:execute (op[,args ]) データベース クエリとコマンドを実行します

use using using using through out through out through out' s through ' s ‐ through ‐ ‐‐‐‐ および を実行して結果を取得します
残りの行をすべて集約します
rowcount 数値最新の実行によって返された行数または影響を受ける行の数

使用する 使用するto 注文や結果を届けるために車両を輸送します。


3. 簡単なコマンド:

select クエリデータ: sql="select * from table name selected item"

insert データを挿入: sql="insert into table name selected item"

update 変更データ: sql= " updata テーブル名 変更された項目を設定します"

delete delete data: sql = "削除された項目をテーブル名から削除"

ここで は SQL コマンドのキーでもあり、通常はテーブル ヘッダー = その列を見つけるための列名です


4. トランザクション

データベースにアクセスして更新するプログラムの実行単位。実行されたコマンドをトランザクションと呼ぶことができます

原子性、一貫性、分離性、耐久性を持っています

トランザクションの実行:

conn.commit() トランザクションを正常に終了します

conn.rollback() トランザクションを異常終了し、プログラム実行単位での継続動作にエラーが発生した場合、以前の動作に戻します。

簡単な操作プロセス: 開始 → 接続の作成 → カーソルの取得 → プログラム実行ユニット → カーソルを閉じる → 接続を閉じる → 終了

2. 銀行振込システムのコードをシミュレートします

#coding=utf-8 
import sys 
import MySQLdb 
''''' 
python操作MySQL数据库,模拟银行转账 
''' 
class Trans_for_Money(object): 
 #初始化 类 
 def __init__(self,conn): 
  self.conn = conn 
 #### 1、检查所输入的账号是否存在 #### 
 def check_acct_available(self,source_acctid): 
  #使用与数据库的链接并返回游标 
  cursor=self.conn.cursor() 
  try: 
   #数据库命令 
   sql="select * from tr_money where acctid=%s" %source_acctid 
   #执行命令 
   cursor.execute(sql) 
   #为方便观察执行过程 
   print "check_acct_available:" + sql 
   #讲结果集放入变量result中,若result不等于1,则没有这个账号,输出异常 
   result=cursor.fetchall() 
   if len(result)!=1: 
    raise Exception("账号%s不存在" %source_acctid) 
  finally: 
   #若过程出现问题,仍需要关闭游标对象 
   cursor.close() 
 #### 2、检查减款人余额是否充足,方法与上一个函数一样,只是多加了一个money参数 ### 
 def has_enough_money(self,source_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   sql="select * from tr_money where acctid=%s and money>%s" %(source_acctid,money) 
   cursor.execute(sql) 
   print "has_enough_money:" + sql 
   result=cursor.fetchall() 
   if len(result)!=1: 
    raise Exception("账号%s余额不足" %source_acctid) 
  finally: 
   cursor.close() 
 #### 3、减款操作 ### 
 def reduce_money(self,source_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   #数据库命令,减去对应减款人的金额数 
   sql="update tr_money set money=money-%s where acctid=%s" %(money,source_acctid) 
   cursor.execute(sql) 
   print "reduce_money:" + sql 
   #操作的execute()数据行数不等于1则减款失败 
   if cursor.rowcount!=1: 
    raise Exception("账号%s减款失败" %source_acctid) 
  finally: 
   cursor.close() 
 #### 4、收款操作,与减款方法相同 ### 
 def add_money(self,target_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   sql="update tr_money set money=money+%s where acctid =%s" %(money,target_acctid) 
   cursor.execute(sql) 
   print "add_money:" + sql 
   if cursor.rowcount!=1: 
    raise Exception("账号%s收款失败" %target_acctid) 
  finally: 
   cursor.close() 
 #### 5、分别传入参数,代入上方函数,执行操作 ### 
 def trans_for(self,source_acctid,target_acctid,money): 
  try: 
   self.check_acct_available(source_acctid) 
   self.check_acct_available(target_acctid) 
   self.has_enough_money(source_acctid,money) 
   self.reduce_money(source_acctid,money) 
   self.add_money(target_acctid,money) 
   #提交当前事务 
   self.conn.commit() 
  except Exception as e: 
   #若出错,回滚当前事务 
   self.conn.rollback() 
   raise e 
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', 
       port=3306, 
       user='root', 
       passwd='12345678', 
       db='tt', 
       charset='utf8' 
       ) 
 #手动输入减款人、收款人、转款数 
 source_acctid=raw_input("请输入减款人: ") 
 target_acctid=raw_input("请输入收款人: ") 
 money=raw_input("请输入转款数: ") 
 #将参数传入类中 
 tr_money=Trans_for_Money(conn) 
 try: 
  tr_money.trans_for(source_acctid,target_acctid,money) 
 except Exception as e: 
  print"出现问题:"+str(e) 
 finally: 
  conn.close() 
  #关闭链接

3. 問題解決


1.sys.argv[ ]

なぜなら、教育ビデオで使用されている IDE は MyEclipse で、最後にパラメーターを入力するために run.Configuration を使用し、pycharm を使用しているためです。つまり、私が愚かで見つからないか、実際には存在しません。

そこで、実行時にパラメータを入力するために raw_input() を使用することにしました

実際、sys.argv[ ] を理解しようと試みましたが、まだ明確に理解できません。

2. mysql_Exceptions.IntegrityError: (1062、「キー 'PRIMARY' のエントリ '7' が重複しています」)

このエラーは、挿入したいデータがデータベース内にすでに存在していることを意味します。独自のプログラムの操作に矛盾はありますか

3. テーブルの作成時または値の入力時に MySql エラーが発生しました: 1170-BLOB/TEXT の列 'name' がキーの長さのないキー仕様で使用されています

エラー メッセージは、BLOB です。または TEXT フィールドが指定されていないキー長を使用しています。 キー

解決策: 他の主キーを設定するか、データ形式を varchar に変更します

詳しい説明 URL: http://myhblog1989.blog.163.com/blog/static/183225376201110875818884/

4. TypeError: 'post' はこの関数では無効なキーワード引数です

エラーの原因: TypeError: "post" はこの関数では無効なパラメータです

この質問はあまりにも間違っており、私は言葉を失いました。 "post"=' 3306' の代わりに "port"=3306 と書きました

5, 1054, "Unknown columns 'acctid' in 'where 句'

エラーの原因: "acctid" 列がwhere句

あはは、前回の間違いで頭の中の水分が抜けていないです...

さらに、もう一つ間違いがあります、それは控除の手入力です。受取人が文字または漢字に設定されている場合、検索できません

テーブル作成時のコードまたはデータベースが原因である可能性があります。設定の問題は、私が文字変換とデータベースに関してまだ初心者であることを意味します。ファイティング!

7. MySQL データベースを起動します

コンピューター→右クリック→管理→サービスとアプリケーション→サービス→MySQL を右クリック→開始

4.具体的な実行表示

1.データベースの tr_money テーブル

2. コードを実行し、減算者、受取人、送金金額を入力して

3 を実行すると、結果はコード内に特別に出力された操作プロセス表示になります

4. 実行後のデータベース tr_money テーブルのステータス

概要

以上がMySQL を操作して銀行振込操作をシミュレートする Python の簡単な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。