如何串連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行以下是擷取資料庫表,文法後面會講
資料庫的操作和結果顯示
我們利用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()