日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库

發布時間:2024/9/19 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

環境:MySQL 5.6.27, Ubuntu 15.10 64-bit

官方簡介

MySQLdb is an thread-compatible interface to the popular MySQL

database server that provides the Python database API.

安裝

通過 pip 安裝

$ apt-get install python-dev libmysqlclient-dev

$ pip install MySQL-python

通過 apt 安裝

$ sudo apt-get install python-mysqldb

模塊 _mysql

MySQLdb 安裝好后,有兩個模塊或方式可用。模塊 _mysql 提供的是類似于 MySQL C 接口的 API,而模塊 MySQLdb 在 _mysql 基礎上又做了進一步封裝,使之符合 Python 的數據庫 API 規范。推薦使用后者。

使用 _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()

創建表,插入數據

# 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("曹雪芹")')

查詢

一次取回所有結果:fetchall

import MySQLdb as mdb

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

with con:

cur = con.cursor()

cur.execute('select * from writers')

# 結果集 rows 為元組(tuple)的元組,每一個元組代表了表中的一行。

rows = cur.fetchall()

for row in rows:

print row

挨個取回結果: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'] # 通過列名訪問結果

打印列名

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()

# 元組的元組,每一個元組對應一個結果列,元組的第一個元素為列名。

desc = cur.description

# 打印前兩個結果列的列名。

print '%s %3s' % (desc[0][0], desc[1][0])

for row in rows:

print '%2s %3s' % row

Prepared Statements

Prepared Statements 可以提高安全性和性能,特別是對于多次重復執行的查詢。Python 的數據庫 API 規范建議了 5 種不同的方式來構造 Prepared Statements,MySQLdb 只支持其中的一種,代碼類似于 ANSI printf 的格式化操作。

Prepared Statements 在 ORM 庫(比如 SQLAlchemy)中應該會有更完善的支持。

注(2016-01-10):

這里的 Prepared Statements 只是客戶端的模擬,跟 MySQL Server 的 Prepared Statements 是兩碼事,所以并不能提高性能或安全性。(詳見 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

事務

前面的例子一直使用 with 語句來管理鏈接 (connection) 對象,避免了 commit 的直接調用。

一旦 cursor 創建,一個事務也就開始,結束時必須調用 commit 或 rollback。commit 提交修改,rollback 回滾。如果結合 with 語句使用的話,commit 和 rollback 都將自動完成,因為 MySQLdb 的鏈接對象可以當作 context manager 使用。

# coding: utf-8

import MySQLdb as mdb

try:

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

# Cursor 創建,事務開始。

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")')

# 顯式地調用 commit 來結束一個事務。

con.commit()

except mdb.Error, e:

# 異常發生時,調用 rollback 進行回滾。

if con:

con.rollback()

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

sys.exit(1)

finally:

if con:

con.close()

Cursor 有必要 close 嗎?

原則上講,不需要顯式地調用 cursor 對象的 close 方法,因為當 cursor 對象生命期結束時,close 方法會被自動調用。源碼如下:

class BaseCursor(object):

def __del__(self):

self.close()

self.errorhandler = None

self._result = None

不過,還是建議主動調用 close,這樣至少代碼的行為更加明顯。

總結

以上是生活随笔為你收集整理的python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美图片一区 | 先锋资源国产 | av二区在线 | 51国产在线 | 美女xx网站 | www.欧美在线观看 | 欧美a级大片 | 激情二区| 91最新入口 | 欧美精品观看 | 黄色一级大片在线观看 | 中文字幕 自拍偷拍 | 国产黄色在线看 | 精品精品 | 欧美乱大交xxxxx潮喷 | 日女人网站| 久久视频中文字幕 | 91视频色 | 日本公妇乱淫免费视频一区三区 | 在线观看三级视频 | 羞视频在线观看 | 亚洲国产精品久 | 快色在线观看 | 97精品人人妻人人 | 99热一区二区| 丝袜美腿一区二区三区 | 伊人网五月天 | 亚洲一级片免费 | av网址导航 | 激情视频网站 | 久久99热久久99精品 | 肉色超薄丝袜脚交一区二区图片 | 亚洲四区| 久久久精品国产sm调教 | 看毛片网| 免费av观看 | 玖玖爱av | 我要色综合天天 | 操欧美美女| 玉丸(双性调教) | 国产偷人妻精品一区二区在线 | 婷婷综合久久 | 被黑人猛躁10次高潮视频 | 中文字幕一区二区三区精彩视频 | 久久午夜鲁丝片午夜精品 | 能看av的网址 | 国产九九精品视频 | 成人免费av片| av免费在线不卡 | 国产午夜福利一区 | 91看片免费看 | 天堂色综合 | 爱情岛论坛av | 天天天天操 | 五月婷婷开心中文字幕 | 性色视频在线观看 | 国产盗摄视频在线观看 | 美女大逼| a级成人毛片 | 麻豆成人av| 亚洲天堂影院 | 超碰老司机 | 欧美涩涩涩 | 性色视频 | 韩国一级一片高清免费观看 | 777久久久精品一区二区三区 | 久久人妻少妇嫩草av蜜桃 | 懂色av一区二区三区 | 小辣椒福利视频导航 | 中文字幕 视频一区 | 97国产精品人人爽人人做 | 久久久久无码国产精品一区 | 国产午夜精品久久久久久久久久 | 茄子av| 久久亚洲国产精品 | 一级免费av| 18无码粉嫩小泬无套在线观看 | 亚洲国产精品成人综合色在线婷婷 | 四川黄色一级片 | 一级片av| 欧美日韩在线观看一区二区三区 | 成人激情自拍 | 黄色永久免费网站 | 成年人毛片 | 天天看夜夜操 | 做爰视频毛片视频 | 国产色av| a毛片毛片av永久免费 | av色欲无码人妻中文字幕 | 国产高清第一页 | 国产精品亚洲二区在线观看 | 91精品国产一区二区三区 | 六月丁香综合 | 高中男男gay互囗交观看 | 传媒视频在线观看 | 66av欧美 | 操人视频免费 | 久久久久99精品成人片 | 欧美成人做爰大片免费看黄石 |