轉載 Python 操做 MySQL 的正確姿式 - 琉璃塊

Python 操做 MySQL 的正確姿式

收錄待用,修改轉載已取得騰訊雲受權javascript


做者 |邵建永
編輯 | 顧鄉css

使用Python進行MySQL的庫主要有三個,Python-MySQL(更熟悉的名字多是MySQLdb),PyMySQL和SQLAlchemy。html

Python-MySQL資格最老,核心由C語言打造,接口精煉,性能最棒,缺點是環境依賴較多,安裝複雜,近兩年已中止更新,只支持Python2,不支持Python3。java

PyMySQL爲替代Python-MySQL而生,純python打造,接口與Python-MySQL兼容,安裝方便,支持Python3。python

SQLAlchemy是一個ORM框架,它並不提供底層的數據庫操做,而是要藉助於MySQLdb、PyMySQL等第三方庫來完成,目前SQLAlchemy在Web編程領域應用普遍。mysql

本文主要介紹PyMySQL的正確使用方法,示例代碼都是選自實戰項目。git

安裝

簡單的方式:程序員

pip install pymysql

若是沒法聯網,須要進行離線安裝,例如:sql

pip install pymysql-x.x.x.tar.gz

導入

import pymysql

鏈接

def connect_wxremit_db():
    return pymysql.connect(host='10.123.5.28',
                           port=3306,
                           user='root',
                           password='root1234',
                           database='db_name',
                           charset='latin1')

查詢

def query_country_name(cc2): sql_str = ("SELECT Fcountry_name_zh" + " FROM t_country_code" + " WHERE Fcountry_2code='%s'" % (cc2)) logging.info(sql_str)
con = mysql_api.connect_wxremit_db()
cur = con.cursor()
cur.<span class="hljs-built_in">execute</span>(sql_str)
rows = cur.fetchall()
cur.<span class="hljs-built_in">close</span>()
con.<span class="hljs-built_in">close</span>()

<span class="hljs-built_in">assert</span> <span class="hljs-built_in">len</span>(rows) == <span class="hljs-number">1</span>, <span class="hljs-string">'Fatal error: country_code does not exists!'</span>
<span class="hljs-keyword">return</span> rows[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>]
con = mysql_api.connect_wxremit_db() cur = con.cursor() cur.<span class="hljs-built_in">execute</span>(sql_str) rows = cur.fetchall() cur.<span class="hljs-built_in">close</span>() con.<span class="hljs-built_in">close</span>() <span class="hljs-built_in">assert</span> <span class="hljs-built_in">len</span>(rows) == <span class="hljs-number">1</span>, <span class="hljs-string">'Fatal error: country_code does not exists!'</span> <span class="hljs-keyword">return</span> rows[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>]

簡單插入

def insert_file_rec(self, file_name, file_md5):
        con = mysql_api.connect_wxremit_db()
        cur = con.cursor()
        try:
            sql_str = ("INSERT INTO t_forward_file (Ffile_name, Ffile_md5)", 
                       + " VALUES ('%s', '%s')" % (file_name, file_md5))
            cur.execute(sql_str)
            con.commit()
        except:
            con.rollback()
            logging.exception('Insert operation error')
            raise
        finally:
            cur.close()
            con.close()

批量插入

數據庫

remit_ids = [('1234', 'CAD'), ('5678', 'HKD')]con = mysql_api.connect_wxremit_db()
cur = con.cursor()
try:
cur.executemany("INSERT INTO t_order (Fremit_id, Fcur_type, Fcreate_time"
+ " VALUES (%s, %s, now())", new_items)
assert cur.rowcount == len(remit_ids), 'my error message'
con.commit()
except Exception as e:
con.rollback()
logging.exception('Insert operation error')
finally:
cur.close()
con.close()

更新

def update_refund_trans(self, remit_id): con = mysql_api.connect_wxremit_db() cur = con.cursor() try: sql_str = ("SELECT Fremit_id" + " FROM t_wxrefund_trans" + " WHERE Fremit_id='%s'" % remit_id + " FOR UPDATE") logging.info(sql_str)
        cur.execute(sql_str)
        <span class="hljs-keyword">assert</span> cur.rowcount == <span class="hljs-number">1</span>, <span class="hljs-string">'Fatal error: The wx-refund record be deleted!'</span>

        sql_str = (<span class="hljs-string">"UPDATE t_wxrefund_trans"</span>
                    + <span class="hljs-string">" SET Fcheck_amount_flag=1"</span>
                    + <span class="hljs-string">", Fmodify_time=now()"</span>
                    + <span class="hljs-string">" WHERE Fremit_id='%s'"</span> % remit_id
        logging.info(sql_str)
        cur.execute(sql_str)

        <span class="hljs-keyword">assert</span> cur.rowcount == <span class="hljs-number">1</span>, <span class="hljs-string">'The number of affected rows not equal to 1'</span>
        con.commit()
    <span class="hljs-keyword">except</span>:
        con.rollback()
        logging.exception(<span class="hljs-string">'Update operation error'</span>)
        <span class="hljs-keyword">raise</span>
    <span class="hljs-keyword">finally</span>:
        cur.close()
        con.close()
cur.execute(sql_str) <span class="hljs-keyword">assert</span> cur.rowcount == <span class="hljs-number">1</span>, <span class="hljs-string">'Fatal error: The wx-refund record be deleted!'</span> sql_str = (<span class="hljs-string">"UPDATE t_wxrefund_trans"</span> + <span class="hljs-string">" SET Fcheck_amount_flag=1"</span> + <span class="hljs-string">", Fmodify_time=now()"</span> + <span class="hljs-string">" WHERE Fremit_id='%s'"</span> % remit_id logging.info(sql_str) cur.execute(sql_str) <span class="hljs-keyword">assert</span> cur.rowcount == <span class="hljs-number">1</span>, <span class="hljs-string">'The number of affected rows not equal to 1'</span> con.commit() <span class="hljs-keyword">except</span>: con.rollback() logging.exception(<span class="hljs-string">'Update operation error'</span>) <span class="hljs-keyword">raise</span> <span class="hljs-keyword">finally</span>: cur.close() con.close()

PyMySQL已經至關成熟,和Python-MySQL同樣,它在不少Linux發行版本中都是可選的安裝組件。


原文連接:https://www.qcloud.com/community/article/687813

0
0
« 上一篇: 程序員的江湖:從黑木崖到回龍觀
» 下一篇: Nginx + Lua搭建文件上傳下載服務
</div>
	<div class="postDesc">posted @ <span id="post-date">2017-04-25 21:26</span> <a href="https://www.cnblogs.com/liuliliuli2017/">琉璃塊</a> 閱讀(<span id="post_view_count">12782</span>) 評論(<span id="post_comment_count">0</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=6763988" rel="nofollow">編輯</a> <a href="#" onclick="AddToWz(6763988);return false;">收藏</a></div>
</div>
posted @ 2019-03-06 11:17  學到老•徐  閱讀( ...)  評論( ...編輯  收藏
相關文章
相關標籤/搜索