成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

【過(guò)時(shí)】MySQLdb:Python 操作 MySQL 數(shù)據(jù)庫(kù)

mj / 491人閱讀

摘要:模塊提供的是類(lèi)似于接口的,而模塊在基礎(chǔ)上又做了進(jìn)一步封裝,使之符合的數(shù)據(jù)庫(kù)規(guī)范。的數(shù)據(jù)庫(kù)規(guī)范建議了種不同的方式來(lái)構(gòu)造,只支持其中的一種,代碼類(lèi)似于的格式化操作。提交修改,回滾。異常發(fā)生時(shí),調(diào)用進(jìn)行回滾。

NOTE(2017-11-18): MySQLdb 不支持 Python 3,而 Python 3 是主流,所以就沒(méi)有學(xué)習(xí)的必要了。

環(huán)境:MySQL 5.6.27, Ubuntu 15.10 64-bit

個(gè)人筆記,可讀性較差。尋教程請(qǐng)移步:MySQL Python tutorial

官方簡(jiǎn)介

MySQLdb is an thread-compatible interface to the popular MySQL
database server that provides the Python database API.

安裝 通過(guò) pip 安裝
$ apt-get install python-dev libmysqlclient-dev
$ pip install MySQL-python

詳見(jiàn):How to install Python MySQLdb module using pip?

通過(guò) apt 安裝
$ sudo apt-get install python-mysqldb
模塊 _mysql

MySQLdb 安裝好后,有兩個(gè)模塊或方式可用。模塊 _mysql 提供的是類(lèi)似于 MySQL C 接口的 API,而模塊 MySQLdb_mysql 基礎(chǔ)上又做了進(jìn)一步封裝,使之符合 Python 的數(shù)據(jù)庫(kù) API 規(guī)范。推薦使用后者。

使用 _mysql 的例子:

import _mysql
import sys

try:
    con = _mysql.connect("localhost", "root", "******", "test")

    con.query("select version()")
    result = con.use_result()

    print "MySQL version: %s" % result.fetch_row()[0]

except _mysql.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)

finally:
    if con:
        con.close()

改用 MySQLdb

import MySQLdb as mdb
import sys

try:
    con = mdb.connect("localhost", "root", "******", "test")

    cur = con.cursor()
    cur.execute("select version()")

    ver = cur.fetchone()

    print "MySQL version: %s" % ver

except mdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)

finally:
    if con:
        con.close()
創(chuàng)建表,插入數(shù)據(jù)
# coding: utf-8

import MySQLdb as mdb

con = mdb.connect("localhost", "root", "******", "test")

with con:
    cur = con.cursor()
    cur.execute("drop table if exists writers")
    cur.execute("create table writers(id int primary key auto_increment,
            name varchar(25)) default charset utf8")
    cur.execute("insert into writers(name) values("Jack London")")
    cur.execute("insert into writers(name) values("Honore de Balzac")")
    cur.execute("insert into writers(name) values("Lion Feuchtwanger")")
    cur.execute("insert into writers(name) values("Emile Zola")")
    cur.execute("insert into writers(name) values("Truman Capote")")
    cur.execute("insert into writers(name) values("曹雪芹")")
查詢(xún) 一次取回所有結(jié)果:fetchall
import MySQLdb as mdb

con = mdb.connect("localhost", "root", "******", "test")

with con:
    cur = con.cursor()
    cur.execute("select * from writers")

    # 結(jié)果集 rows 為元組(tuple)的元組,每一個(gè)元組代表了表中的一行。
    rows = cur.fetchall()
    for row in rows:
        print row
挨個(gè)取回結(jié)果:fetchone
import MySQLdb as mdb

con = mdb.connect("localhost", "root", "******", "test")

with con:
    cur = con.cursor()
    cur.execute("select * from writers")

    for i in range(cur.rowcount):
        row = cur.fetchone()
        print row
使用字典 Cursor
import MySQLdb as mdb

con = mdb.connect("localhost", "root", "******", "test")

def test_dict_cursor():
    with con:
        cur = con.cursor(mdb.cursors.DictCursor) # 字典 cursor
        cur.execute("select * from writers limit 4")

        # rows 為字典的元組
        rows = cur.fetchall()
        for row in rows:
            print row["id"], row["name"] # 通過(guò)列名訪問(wèn)結(jié)果
打印列名
import MySQLdb as mdb

con = mdb.connect("localhost", "root", "******", "test")

with con:
    cur = con.cursor()
    cur.execute("select * from writers limit 4")

    rows = cur.fetchall()
        
    # 元組的元組,每一個(gè)元組對(duì)應(yīng)一個(gè)結(jié)果列,元組的第一個(gè)元素為列名。
    desc = cur.description

    # 打印前兩個(gè)結(jié)果列的列名。
    print "%s %3s" % (desc[0][0], desc[1][0])

    for row in rows:
        print "%2s %3s" % row
Prepared Statements

Prepared Statements 可以提高安全性和性能,特別是對(duì)于多次重復(fù)執(zhí)行的查詢(xún)。Python 的數(shù)據(jù)庫(kù) API 規(guī)范建議了 5 種不同的方式來(lái)構(gòu)造 Prepared Statements,MySQLdb 只支持其中的一種,代碼類(lèi)似于 ANSI printf 的格式化操作。

Prepared Statements 在 ORM 庫(kù)(比如 SQLAlchemy)中應(yīng)該會(huì)有更完善的支持。

注(2016-01-10):
這里的 Prepared Statements 只是客戶(hù)端的模擬,跟 MySQL Server 的 Prepared Statements 是兩碼事,所以并不能提高性能或安全性。(詳見(jiàn) C API Prepared Statements)

import MySQLdb as mdb

con = mdb.connect("localhost", "root", "******", "test")

with con:
    cur = con.cursor()

    cur.execute("update writers set name = %s where id = %s",
            ("Guy de Maupasant", "4"))

    print "Number of rows updated:", cur.rowcount
事務(wù)

前面的例子一直使用 with 語(yǔ)句來(lái)管理鏈接 (connection) 對(duì)象,避免了 commit 的直接調(diào)用。

一旦 cursor 創(chuàng)建,一個(gè)事務(wù)也就開(kāi)始,結(jié)束時(shí)必須調(diào)用 commitrollback。commit 提交修改,rollback 回滾。如果結(jié)合 with 語(yǔ)句使用的話(huà),commitrollback 都將自動(dòng)完成,因?yàn)?MySQLdb 的鏈接對(duì)象可以當(dāng)作 context manager 使用。

# coding: utf-8

import MySQLdb as mdb

try:
    con = mdb.connect("localhost", "root", "******", "test")

    # Cursor 創(chuàng)建,事務(wù)開(kāi)始。
    cur = con.cursor()

    cur.execute("drop table if exists writers")
    # MyISAM doesn"t support transaction.
    cur.execute("create table writers(id int primary key auto_increment,
            name varchar(25)) engine=innodb")

    cur.execute("insert into writers(name) values("Jack London")")
    cur.execute("insert into writers(name) values("Honore de Balzac")")
    cur.execute("insert into writers(name) values("Lion Feuchtwanger")")
    cur.execute("insert into writers(name) values("Emile Zola")")
    cur.execute("insert into writers(name) values("Truman Capote")")

    # 顯式地調(diào)用 commit 來(lái)結(jié)束一個(gè)事務(wù)。
    con.commit()

except mdb.Error, e:
    # 異常發(fā)生時(shí),調(diào)用 rollback 進(jìn)行回滾。
    if con:
        con.rollback()

    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)

finally:
    if con:
        con.close()
Cursor 有必要 close 嗎?

原則上講,不需要顯式地調(diào)用 cursor 對(duì)象的 close 方法,因?yàn)楫?dāng) cursor 對(duì)象生命期結(jié)束時(shí),close 方法會(huì)被自動(dòng)調(diào)用。源碼如下:

class BaseCursor(object):
    def __del__(self):
        self.close()
        self.errorhandler = None
        self._result = None

不過(guò),還是建議主動(dòng)調(diào)用 close,這樣至少代碼的行為更加明顯。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37667.html

相關(guān)文章

  • [零基礎(chǔ)學(xué)python]用Python操作數(shù)據(jù)庫(kù)(3)

    摘要:用選擇要操作的數(shù)據(jù)庫(kù),然后通過(guò)指針就可以操作這個(gè)數(shù)據(jù)庫(kù)了。這樣就在這個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)名為的表這是查看表的方式。樹(shù)欲靜而風(fēng)不止,小偷在行動(dòng)。所以,要特別提醒諸位注意。 通過(guò)python操作數(shù)據(jù)庫(kù)的行為,除了能夠完成前面兩講中的操作之外(當(dāng)然,那是比較常用的),其實(shí)任何對(duì)數(shù)據(jù)庫(kù)進(jìn)行的操作,都能夠通過(guò)python-mysqldb來(lái)實(shí)現(xiàn)。 建立數(shù)據(jù)庫(kù) 在《用python操作數(shù)據(jù)庫(kù)(1)...

    BDEEFE 評(píng)論0 收藏0
  • [零基礎(chǔ)學(xué)python]通過(guò)Python連接數(shù)據(jù)庫(kù)

    摘要:用來(lái)編寫(xiě)網(wǎng)站,必須要能夠通過(guò)操作數(shù)據(jù)庫(kù),所謂操作數(shù)據(jù)庫(kù),就是通過(guò)實(shí)現(xiàn)對(duì)數(shù)據(jù)的連接,以及對(duì)記錄字段的各種操作。交互模式下操作數(shù)據(jù)庫(kù)之連接數(shù)據(jù)庫(kù)操作數(shù)據(jù)庫(kù)的前提是先有數(shù)據(jù)庫(kù)。先建立一個(gè)數(shù)據(jù)庫(kù)。 用Python來(lái)編寫(xiě)網(wǎng)站,必須要能夠通過(guò)python操作數(shù)據(jù)庫(kù),所謂操作數(shù)據(jù)庫(kù),就是通過(guò)python實(shí)現(xiàn)對(duì)數(shù)據(jù)的連接,以及對(duì)記錄、字段的各種操作。上一講提到的那種操作方式,是看官直接通過(guò)交互模式來(lái)操...

    hover_lew 評(píng)論0 收藏0
  • 為64位Windows7的Python3安裝MySQLdb

    摘要:為位的安裝原文在此基督尼瑪個(gè)耶穌這一切始于一個(gè)簡(jiǎn)單的想法我想裝然后寫(xiě)個(gè)網(wǎng)站并用這個(gè)機(jī)會(huì)多學(xué)點(diǎn)和的知識(shí)我理所當(dāng)然的選當(dāng)數(shù)據(jù)庫(kù)因?yàn)樵谖壹依锏哪桥_(tái)電腦上裝著之前的一個(gè)項(xiàng)目里用到的服務(wù)我從沒(méi)想到因?yàn)檫x擇讓我接下來(lái)的幾個(gè)夜晚都因?yàn)樘幚淼膯?wèn)題而過(guò)的 Install 64-bit MySQLdb for Python 3 on Windows 7 為64位Windows7的Pyhton3安裝MySQ...

    Corwien 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

mj

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<