Python的Mysql訪問甚亭,及SSH連接Mysql

三種驅(qū)動(dòng)mysql.connector、PyMySQL怔匣、mysqldb使用和比較

mysql-connector-python

此為廖雪峰老師教程中所用驅(qū)動(dòng)握联,為python官方驅(qū)動(dòng)。安裝命令:

pip install mysql-connector-python --allow-external mysql-connector-python

或者

pip install mysql-connector

使用mysql.connector訪問數(shù)據(jù)庫:

import mysql.connector
# password設(shè)為mysql的root口令
conn = mysql.connector.connect(user='root', password='password', database='test')
cursor = conn.cursor()
# 創(chuàng)建user表
cursor.execute('要執(zhí)行的sql語句')
# 提交事務(wù)
conn.commit()
# 關(guān)閉Cursor和Connection:
cursor.close()
conn.close()

PyMySQL 驅(qū)動(dòng)

PyMySQL僅限于 Python3.x 版本中連接 MySQL 每瞒。

  • 安裝命令:
pip3 install PyMySQL

若pip安裝失敗金闽,可使用git命令或者手動(dòng)下載源安裝包后,進(jìn)入工程目錄使用python命令手動(dòng)安裝:

cd PyMySQL/
python3 setup.py install
  • 使用PyMySQL訪問數(shù)據(jù)庫-建表:
#!/usr/bin/python3
 
import pymysql
 
# 打開數(shù)據(jù)庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
cursor = db.cursor()
 
# 使用 execute() 方法執(zhí)行 SQL剿骨,如果表存在則刪除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
 
# 使用預(yù)處理語句創(chuàng)建表
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
 
cursor.execute(sql)
 
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
  • 使用PyMySQL訪問數(shù)據(jù)庫-插入呐矾、更新、刪除數(shù)據(jù):
    注意事務(wù)提交以及錯(cuò)誤回滾處理
#!/usr/bin/python3
 
import pymysql
 
# 打開數(shù)據(jù)庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法獲取操作游標(biāo) 
cursor = db.cursor()
 
# SQL 插入語句
# 此處可將sql換為update懦砂、delete等語句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s',  %s,  '%s',  %s)" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # 執(zhí)行sql語句
   cursor.execute(sql)
   # 執(zhí)行sql語句
   db.commit()
except:
   # 發(fā)生錯(cuò)誤時(shí)回滾
   db.rollback()
 
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
  • 使用PyMySQL訪問數(shù)據(jù)庫-查詢:
    可使用fetchall()等方法對(duì)查詢結(jié)果進(jìn)行獲取和進(jìn)一步處理蜒犯,見代碼中注釋
#!/usr/bin/python3

import pymysql
 
# 打開數(shù)據(jù)庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法獲取操作游標(biāo) 
cursor = db.cursor()
 
# SQL 查詢語句
sql_query = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > %s" % (1000)
try:
   # 執(zhí)行SQL語句
   cursor.execute(sql_query)
   # fetchone(): 該方法獲取下一個(gè)查詢結(jié)果集。結(jié)果集是一個(gè)對(duì)象
   # fetchall(): 接收全部的返回結(jié)果行.
   # rowcount: 這是一個(gè)只讀屬性荞膘,并非方法罚随,直接返回執(zhí)行execute()方法后影響的行數(shù)。
   results = cursor.fetchall()
   for row in results:
      pass
except:
   print ("Error: unable to fetch data")
 
# 關(guān)閉數(shù)據(jù)庫連接
db.close()

MySQLdb驅(qū)動(dòng)

僅支持linux的python2.x版本羽资。用法同上類似淘菩,安裝:

pip install  MySQLdb

比較和總結(jié)

  • mysql.connector作為官方版本,在Python中重新實(shí)現(xiàn)MySQL協(xié)議屠升,速度相對(duì)最慢潮改,但因?yàn)椴灰蕾嚻渌鼛欤虼俗畋銛y腹暖;
  • PyMySQL 限制于Python3.x 版本汇在;
  • MySQLdb限制于Python2.x 版本,且不支持windows脏答。
    因此推薦使用PyMySQL糕殉。

SSH連接Mysql

基于pymysql與sshtunnel,實(shí)現(xiàn)mysql跳轉(zhuǎn)連接殖告,用于服務(wù)器無法直接本地連接的場(chǎng)景阿蝶。即:在本地(記為地址A),通過SSH中間服務(wù)器B黄绩,連接遠(yuǎn)程MYSQL服務(wù)器C羡洁。
下述代碼中地址及端口,根據(jù)實(shí)際網(wǎng)絡(luò)策略進(jìn)行配置:

from pymysql import connect
from sshtunnel import SSHTunnelForwarder

# 指定SSH遠(yuǎn)程跳轉(zhuǎn)
server = SSHTunnelForwarder(ssh_address_or_host=('IP地址B', B端口號(hào)),  # 指定SSH中間登錄地址和端口號(hào)
                            ssh_username='user_name_b',  # 指定地址B的SSH登錄用戶名
                            ssh_password='pwd_b',  # 指定地址B的SSH登錄密碼
                            local_bind_address=('127.0.0.1', A端口號(hào)),  # 綁定本地地址A(默認(rèn)127.0.0.1)及與B相通的端口(根據(jù)網(wǎng)絡(luò)策略配置爽丹,若端口全放筑煮,則此行無需配置,使用默認(rèn)即可)
                            remote_bind_address=('IP地址C', 3306)  # 指定最終目標(biāo)C地址习劫,端口號(hào)為mysql默認(rèn)端口號(hào)3306
                            )

server.start()
# 打印本地端口咆瘟,以檢查是否配置正確
print(server.local_bind_port)

# 設(shè)置mysql連接參數(shù),地址與端口均必須設(shè)置為本地地址與端口
# 用戶名和密碼以及數(shù)據(jù)庫名根據(jù)自己的數(shù)據(jù)庫進(jìn)行配置
db = connect(host="127.0.0.1", port=server.local_bind_port, user="root", passwd="root_pwd", db="test_db")

cursor = db.cursor()

sql = "select COUNT(1) from table1"

try:
    # 執(zhí)行SQL語句檢查是否連接成功
    cursor.execute("SELECT VERSION()")
    result = cursor.fetchone()
    print("Database version : %s " % result)
    #執(zhí)行查詢語句
    cursor.execute(sql)
    result = cursor.fetchone()
    print("sql result : %s" % result)
except:
    print("Error: unable to fetch data")

# 關(guān)閉連接
db.close()
server.close()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诽里,一起剝皮案震驚了整個(gè)濱河市袒餐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谤狡,老刑警劉巖灸眼,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異墓懂,居然都是意外死亡焰宣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門捕仔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匕积,“玉大人盈罐,你說我怎么就攤上這事∩了簦” “怎么了盅粪?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悄蕾。 經(jīng)常有香客問我票顾,道長,這世上最難降的妖魔是什么帆调? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任奠骄,我火速辦了婚禮,結(jié)果婚禮上番刊,老公的妹妹穿的比我還像新娘含鳞。我一直安慰自己,他們只是感情好撵枢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布民晒。 她就那樣靜靜地躺著,像睡著了一般锄禽。 火紅的嫁衣襯著肌膚如雪潜必。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天沃但,我揣著相機(jī)與錄音磁滚,去河邊找鬼。 笑死宵晚,一個(gè)胖子當(dāng)著我的面吹牛垂攘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淤刃,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼晒他,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了逸贾?” 一聲冷哼從身側(cè)響起陨仅,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铝侵,沒想到半個(gè)月后灼伤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咪鲜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年狐赡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疟丙。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颖侄,死狀恐怖鸟雏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情览祖,我是刑警寧澤崔慧,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站穴墅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏温自。R本人自食惡果不足惜玄货,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悼泌。 院中可真熱鬧松捉,春花似錦、人聲如沸馆里。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸠踪。三九已至丙者,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間营密,已是汗流浹背械媒。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留评汰,地道東北人纷捞。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像被去,于是被迫代替她去往敵國和親主儡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345