python之MySQLdb庫的使用

來源:互聯網
上載者:User

 在開發的過程中避免不了和資料庫的互動,在實際環境中用的最多的Mysql資料庫,那python是怎麼和Mysql進行互動的呢,python使用一個叫MySQLdb的庫來串連MySQL,好的,下面最要從MySQLdb的安裝、串連MySQL、執行sql語句、如何取得結果、關閉資料庫連接來講述一下:

  1. MySQLdb的安裝

    我使用的是ubuntu系統,安裝方法為:apt-get install python-MySQLdb,這樣當在python環境執行import MySQLdb不報錯就是安

    root@ubuntu:~# pythonPython 2.7.4 (default, Apr 19 2013, 18:32:33)[GCC 4.7.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import MySQLdb>>>
  2. 如何串連Mysql

    MySQLdb提供的connect方法用來和資料庫建立串連,接收數個參數,返回連線物件,如:conn=MySQLdb.connect(host="localhost",user="root",passwd="sa",db="mytable",port=3306)

    比較常用的參數包括:
    host:資料庫主機名稱.預設是用本地主機.
    user:資料庫登陸名.預設是目前使用者.
    passwd:資料庫登陸的秘密.預設為空白.
    db:要使用的資料庫名.沒有預設值,如果在這裡設定了db,則串連時直接連接到Mysql的db設定的資料庫中
    port:MySQL服務使用的TCP連接埠.預設是3306.

    註:connect中的host、user、passwd等可以不寫,只有在寫的時候按照host、user、passwd、db(可以不寫)、port順序寫就可以,注意連接埠號碼port=3306還是不要省略的為好,如果沒有db在port前面,直接寫3306會報錯

    串連成功後,如需切換該使用者的其他資料庫,使用以下語句:conn.select_db('mysql')形式切換資料庫

    >>> con=MySQLdb.connect('localhost','root','123456',port=3306)>>> con.select_db('mysql')>>> cur=con.cursor()>>> cur.execute('show tables')24L>>> cur.fetchall()(('columns_priv',), ('db',), ('event',), ('func',), ('general_log',), ('help_category',), ('help_keyword',), ('help_relation',), ('help_topic',), ('host',), ('ndb_binlog_index',), ('plugin',), ('proc',), ('procs_priv',), ('proxies_priv',), ('servers',), ('slow_log',), ('tables_priv',), ('time_zone',), ('time_zone_leap_second',), ('time_zone_name',), ('time_zone_transition',), ('time_zone_transition_type',), ('user',))

    第1行:串連資料庫    第2行:選擇串連mysql這個資料庫    第3行以下是擷取資料庫表,文法後面會講

  3. 怎麼操作資料庫,MySQLdb用遊標指標)cursor的方式操作資料庫

    因該模組底層其實是調用C API的,所以,需要先得到當前指向資料庫的指標

    >>> cur=con.cursor()
  4. 資料庫的操作和結果顯示

    我們利用cursor提供的方法來進行操作,方法主要是1.執行命令 2.接收結果

    ursor用來執行命令的方法:
    execute(query, args):執行單條sql語句,接收的參數為sql語句本身和使用的參數列表,傳回值為受影響的行數
    executemany(query, args):執行單挑sql語句,但是重複執行參數列表裡的參數,傳回值為受影響的行數

    cursor用來接收傳回值的方法:
    fetchall(self):接收全部的返回結果行.
    fetchmany(size=None):接收size條返回結果行.如果size的值大於返回的結果行的數量,則會返回cursor.arraysize條資料.
    fetchone():返回一條結果行.
    scroll(value, mode='relative'):移動指標到某一行.如果mode='relative',則表示從當前所在行移動value條,如果mode='absolute',則表示從結果集的第一行移動value條.

    先來看一下execute的增刪改查的操作

    #建立資料庫51ctotest>>> cur.execute('create database 51ctotest')#選擇資料庫51ctotest>>>con.select_db('51ctotest')#建立表51cto,id自增>>>cur.execute('create table if not exists 51cto(id int(11) PRIMARY KEY AUTO_INCREMENT,name varchar(20),age int(3))')#插入一行資料,只給name、age賦值,讓id自增#使用sql語句,這裡要接收的參數都用%s預留位置.要注意的是,無論你要插入的資料是什#麼類型,預留位置永遠都要用%s,後面的數值為元組或者列表>>>cur.execute("insert into 51cto(name,age) values(%s,%s)",('fan',25))#插入多行資料,用executemany,它會迴圈插入後面元組中的所有值>>> cur.executemany("insert into 51cto(name,age) values(%s,%s)",(('te',25),('fei',26),('musha',25)))3L#查詢>>> cur.execute('select * from 51cto')5L#我們使用了fetchall這個方法.這樣,cds裡儲存的將會是查詢返回的全部結果.每條結果都是一個tuple類型的資料,這些tuple組成了一個tuple>>> cur.fetchall()((1L, 'fan', 25L), (2L, 'fan', 25L), (3L, 'te', 25L), (4L, 'fei', 26L), (5L, 'musha', 25L))#重新查詢,會看到查詢不到結果,因為無論fetchone、fetchall、fetchmany指標是會發生移動的。所以,若不重設指標,那麼使用fetchall的資訊將只會包含指標後面的行內容。使用fetchall把指標挪到了最後,可以用scroll手動把指標挪到一個位置>>> cur.fetchall()       ()>>> cur.scroll(1,'absolute')>>> for i in cur.fetchall():...     print i          ...(2L, 'fan', 25L)(3L, 'te', 25L)(4L, 'fei', 26L)(5L, 'musha', 25L)

    這裡有必要說一下scroll:

    cur.scroll(int,parm)這裡參數含義為:
    int:移動的行數,整數;在相對模式下,正數向下移動,負值表示向上移動。
    parm:移動的模式,預設是relative,相對模式;可接受absoulte,絕對模式。
    #fetchone一次只取一行,指標下移  fetchmanysize)一次去size行>>> cur.scroll(1,'absolute')>>> cur.fetchone()(2L, 'fan', 25L)>>> cur.fetchmany(2)((3L, 'te', 25L), (4L, 'fei', 26L))#普通取出是元組的形式,再從裡面取值不好取,那怎麼取成字典的格式呢,MySQLdb中有DictCursor,要做到這點也很簡單,那就是建立資料庫連接是傳遞cusorclass參數,或者在擷取Cursor對象時傳遞cusorclass參數即可>>> cur = con.cursor(cursorclass=MySQLdb.cursors.DictCursor)  >>> cur.execute('select * from 51cto')5L>>> for i in cur.fetchall():...     print i...{'age': 25L, 'id': 2L, 'name': 'fan'}{'age': 25L, 'id': 3L, 'name': 'te'}{'age': 26L, 'id': 4L, 'name': 'fei'}{'age': 25L, 'id': 5L, 'name': 'musha'}#更新,習慣%s的用法>>> cur.execute('update 51cto set name=%s where id=3',('Mus'))>>> cur.scroll(2,'absolute')>>> cur.fetchone()        {'age': 25L, 'id': 3L, 'name': 'Mus'}#在執行完插入或刪除或修改操作後,需要調用一下conn.commit()方法進行提交.這樣,資料才會真正保 存在資料庫中>>> con.commit()#最後關閉遊標,關閉串連>>> cur.close()>>> con.close()


本文出自 “linux開源-不斷的總結....” 部落格,請務必保留此出處http://fantefei.blog.51cto.com/2229719/1282443

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.