国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 后端開(kāi)發(fā) Python教程 再Python程序中操作MySQL的基本方法

再Python程序中操作MySQL的基本方法

Jun 06, 2016 am 11:13 AM
mysql python

Python操作Mysql

最近在學(xué)習(xí)python,這種腳本語(yǔ)言毫無(wú)疑問(wèn)的會(huì)跟數(shù)據(jù)庫(kù)產(chǎn)生關(guān)聯(lián),因此這里介紹一下如何使用python操作mysql數(shù)據(jù)庫(kù)。我python也是零基礎(chǔ)學(xué)起,所以本篇博客針對(duì)的是python初學(xué)者,大??梢赃x擇繞道。

另外,本篇基于的環(huán)境是Ubuntu13.10,使用的python版本是2.7.5。
MYSQL數(shù)據(jù)庫(kù)

MYSQL是一個(gè)全球領(lǐng)先的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng)。它是一個(gè)支持多用戶、多線程的數(shù)據(jù)庫(kù)管理系統(tǒng),與Apache、PHP、Linux共同組成LAMP平臺(tái),在web應(yīng)用中廣泛使用,例如Wikipedia和YouTube。MYSQL包含兩個(gè)版本:服務(wù)器系統(tǒng)和嵌入式系統(tǒng)。
環(huán)境配置

在我們開(kāi)始語(yǔ)法學(xué)習(xí)之前,還需要按裝mysql和python對(duì)mysql操作的模塊。

安裝mysql:

sudo apt-get install mysql-server

安裝過(guò)程中會(huì)提示你輸入root帳號(hào)的密碼,符合密碼規(guī)范即可。

接下來(lái),需要安裝python對(duì)mysql的操作模塊:

sudo apt-get install python-mysqldb

這里需要注意:安裝完python-mysqldb之后,我們默認(rèn)安裝了兩個(gè)python操作模塊,分別是支持C語(yǔ)言API的_mysql和支持Python API的MYSQLdb。稍后會(huì)重點(diǎn)講解MYSQLdb模塊的使用。

接下來(lái),我們進(jìn)入MYSQL,創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)庫(kù)叫testdb。創(chuàng)建命令為:

create database testdb;


然后,我們創(chuàng)建一個(gè)測(cè)試賬戶來(lái)操作這個(gè)testdb數(shù)據(jù)庫(kù),創(chuàng)建和授權(quán)命令如下:

create user 'testuser'@'127.0.0.1' identified by 'test123';
grant all privileges on testdb.* to 'testuser'@'127.0.0.1';

_mysql module

_mysql模塊直接封裝了MYSQL的C語(yǔ)言API函數(shù),它與python標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)API接口是不兼容的。我更推薦大家使用面向?qū)ο蟮腗YSQLdb模塊才操作mysql,這里只給出一個(gè)使用_mysql模塊的例子,這個(gè)模塊不是我們學(xué)習(xí)的重點(diǎn),我們只需要了解有這個(gè)模塊就好了。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import _mysql
import sys

try:
  con = _mysql.connect('127.0.0.1', 'testuser', 'test123', 'testdb')
  con.query("SELECT VERSION()")
  result = con.use_result()

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

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

finally:
  if con:
    con.close()

這個(gè)代碼主要是獲取當(dāng)前mysql的版本,大家可以模擬敲一下這部分代碼然后運(yùn)行一下。
MYSQLdb module

MYSQLdb是在_mysql模塊的基礎(chǔ)上進(jìn)一步進(jìn)行封裝,并且與python標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)API接口兼容,這使得代碼更容易被移植。Python更推薦使用這個(gè)MYSQLdb模塊來(lái)進(jìn)行MYSQL操作。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb as mysql

try:
  conn = mysql.connect('127.0.0.1', 'testuser', 'test123', 'testdb')
  cur = conn.cursor()
  cur.execute("SELECT VERSION()")

  version = cur.fetchone()
  print "Database version : %s" % version

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

finally:
  if conn:
    conn.close()


我們導(dǎo)入了MySQLdb模塊并把它重命名為mysql,然后調(diào)用MySQLdb模塊的提供的API方法來(lái)操作數(shù)據(jù)庫(kù)。同樣也是獲取當(dāng)前主機(jī)的安裝的mysql版本號(hào)。
創(chuàng)建新表

接下來(lái),我們通過(guò)MySQLdb模塊創(chuàng)建一個(gè)表,并在其中填充部分?jǐn)?shù)據(jù)。實(shí)現(xiàn)代碼如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

import MySQLdb as mysql

conn = mysql.connect('127.0.0.1', 'testuser', 'test123', 'testdb');

with conn:
  cur = conn.cursor()
  cur.execute("DROP TABLE IF EXISTS writers");
  cur.execute("CREATE TABLE writers(id INT PRIMARY KEY AUTO_INCREMENT, name varchar(25))")
  cur.execute("insert into writers(name) values('wangzhengyi')")
  cur.execute("insert into writers(name) values('bululu')")
  cur.execute("insert into writers(name) values('chenshan')")

這里使用了with語(yǔ)句。with語(yǔ)句會(huì)執(zhí)行conn對(duì)象的enter()和__exit()方法,省去了自己寫(xiě)try/catch/finally了。

執(zhí)行完成后,我們可以通過(guò)mysql-client客戶端查看是否插入成功,查詢語(yǔ)句:

select * from writers;

查詢結(jié)果如下:

2015729102658336.jpg (965×174)

查詢數(shù)據(jù)

剛才往表里插入了部分?jǐn)?shù)據(jù),接下來(lái),我們從表中取出插入的數(shù)據(jù),代碼如下:

#!/usr/bin/python

import MySQLdb as mysql

conn = mysql.connect('127.0.0.1', 'testuser', 'test123', 'testdb');

with conn:
  cursor = conn.cursor()
  cursor.execute("select * from writers")
  rows = cursor.fetchall()

  for row in rows:
    print row


查詢結(jié)果如下:

(1L, 'wangzhengyi')
(2L, 'bululu')
(3L, 'chenshan')

dictionary cursor

我們剛才不論是創(chuàng)建數(shù)據(jù)庫(kù)還是查詢數(shù)據(jù)庫(kù),都用到了cursor。在MySQLdb模塊有許多種cursor類型,默認(rèn)的cursor是以元組的元組形式返回?cái)?shù)據(jù)的。當(dāng)我們使用dictionary cursor時(shí),數(shù)據(jù)是以python字典形式返回的。這樣我們就可以通過(guò)列名獲取查詢數(shù)據(jù)了。

還是剛才查詢數(shù)據(jù)的代碼,改為dictionary cursor只需要修改一行代碼即可,如下所示:

#!/usr/bin/python

import MySQLdb as mysql

conn = mysql.connect('127.0.0.1', 'testuser', 'test123', 'testdb');

with conn:
  cursor = conn.cursor(mysql.cursors.DictCursor)
  cursor.execute("select * from writers")
  rows = cursor.fetchall()

  for row in rows:
    print "id is %s, name is %s" % (row['id'], row['name'])

使用dictionary cursor,查詢結(jié)果如下:

id is 1, name is wangzhengyi
id is 2, name is bululu
id is 3, name is chenshan


預(yù)編譯

之前寫(xiě)過(guò)php的同學(xué)應(yīng)該對(duì)預(yù)編譯很了解,預(yù)編譯可以幫助我們防止sql注入等web攻擊還能幫助提高性能。當(dāng)然,python肯定也是支持預(yù)編譯的。預(yù)編譯的實(shí)現(xiàn)也比較簡(jiǎn)單,就是用%等占位符來(lái)替換真正的變量。例如查詢id為3的用戶的信息,使用預(yù)編譯的代碼如下:

#!/usr/bin/python

import MySQLdb as mysql

conn = mysql.connect('127.0.0.1', 'testuser', 'test123', 'testdb');

with conn:
  cursor = conn.cursor(mysql.cursors.DictCursor)
  cursor.execute("select * from writers where id = %s", "3")
  rows = cursor.fetchone()
  print "id is %d, name is %s" % (rows['id'], rows['name'])

我這里使用了一個(gè)%s的占位符來(lái)替換“3”,代表需要傳入的是一個(gè)字符串類型。如果傳入的不是string類型,則會(huì)運(yùn)行報(bào)錯(cuò)。
事務(wù)

事務(wù)是指在一個(gè)或者多個(gè)數(shù)據(jù)庫(kù)中對(duì)數(shù)據(jù)的原子操作。在一個(gè)事務(wù)中,所有的SQL語(yǔ)句的影響要不就全部提交到數(shù)據(jù)庫(kù),要不就全部都回滾。

對(duì)于支持事務(wù)機(jī)制的數(shù)據(jù)庫(kù),python接口在創(chuàng)建cursor的時(shí)候就開(kāi)始了一個(gè)事務(wù)??梢酝ㄟ^(guò)cursor對(duì)象的commit()方法來(lái)提交所有的改動(dòng),也可以使用cursor對(duì)象的rollback方法來(lái)回滾所有的改動(dòng)。

我這里寫(xiě)一個(gè)代碼,對(duì)不存在的表進(jìn)行插入操作,當(dāng)拋出異常的時(shí)候,調(diào)用rollback進(jìn)行回滾,實(shí)現(xiàn)代碼如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

import MySQLdb as mysql


try:
  conn = mysql.connect('127.0.0.1', 'testuser', 'test123', 'testdb');
  cur = conn.cursor()
  cur.execute("insert into writers(name) values('wangzhengyi4')")
  cur.execute("insert into writers(name) values('bululu5')")
  cur.execute("insert into writerss(name) values('chenshan6')")

  conn.commit()

except mysql.Error, e:
  if conn:
    conn.rollback()
    print "Error happens, rollback is call"

finally:
  if conn:
    conn.close()

執(zhí)行結(jié)果如下:

Error happens, rollback is call

因?yàn)榍皟蓷l數(shù)據(jù)是正確的插入操作,但是因?yàn)檎w回滾,所以數(shù)據(jù)庫(kù)里也沒(méi)有wangzhengyi4和bululu5這兩個(gè)數(shù)據(jù)的存在。

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Laravel 教程
1600
29
PHP教程
1502
276
Python連接到SQL Server PYODBC示例 Python連接到SQL Server PYODBC示例 Jul 30, 2025 am 02:53 AM

安裝pyodbc:使用pipinstallpyodbc命令安裝庫(kù);2.連接SQLServer:通過(guò)pyodbc.connect()方法,使用包含DRIVER、SERVER、DATABASE、UID/PWD或Trusted_Connection的連接字符串,分別支持SQL身份驗(yàn)證或Windows身份驗(yàn)證;3.查看已安裝驅(qū)動(dòng):運(yùn)行pyodbc.drivers()并篩選含'SQLServer'的驅(qū)動(dòng)名,確保使用如'ODBCDriver17forSQLServer'等正確驅(qū)動(dòng)名稱;4.連接字符串關(guān)鍵參數(shù)

什么是加密貨幣中的統(tǒng)計(jì)套利?統(tǒng)計(jì)套利是如何運(yùn)作的? 什么是加密貨幣中的統(tǒng)計(jì)套利?統(tǒng)計(jì)套利是如何運(yùn)作的? Jul 30, 2025 pm 09:12 PM

統(tǒng)計(jì)套利簡(jiǎn)介統(tǒng)計(jì)套利是一種基于數(shù)學(xué)模型在金融市場(chǎng)中捕捉價(jià)格錯(cuò)配的交易方式。其核心理念源于均值回歸,即資產(chǎn)價(jià)格在短期內(nèi)可能偏離長(zhǎng)期趨勢(shì),但最終會(huì)回歸其歷史平均水平。交易者利用統(tǒng)計(jì)方法分析資產(chǎn)之間的關(guān)聯(lián)性,尋找那些通常同步變動(dòng)的資產(chǎn)組合。當(dāng)這些資產(chǎn)的價(jià)格關(guān)系出現(xiàn)異常偏離時(shí),便產(chǎn)生套利機(jī)會(huì)。在加密貨幣市場(chǎng),統(tǒng)計(jì)套利尤為盛行,主要得益于市場(chǎng)本身的低效率與劇烈波動(dòng)。與傳統(tǒng)金融市場(chǎng)不同,加密貨幣全天候運(yùn)行,價(jià)格極易受到突發(fā)新聞、社交媒體情緒及技術(shù)升級(jí)的影響。這種持續(xù)的價(jià)格波動(dòng)頻繁制造出定價(jià)偏差,為套利者提供

python shutil rmtree示例 python shutil rmtree示例 Aug 01, 2025 am 05:47 AM

shutil.rmtree()是Python中用于遞歸刪除整個(gè)目錄樹(shù)的函數(shù),能刪除指定文件夾及其所有內(nèi)容。1.基本用法:使用shutil.rmtree(path)刪除目錄,需處理FileNotFoundError、PermissionError等異常。2.實(shí)際應(yīng)用:可一鍵清除包含子目錄和文件的文件夾,如臨時(shí)數(shù)據(jù)或緩存目錄。3.注意事項(xiàng):刪除操作不可恢復(fù);路徑不存在時(shí)拋出FileNotFoundError;可能因權(quán)限或文件占用導(dǎo)致失敗。4.可選參數(shù):可通過(guò)ignore_errors=True忽略錯(cuò)

如何在Python中執(zhí)行SQL查詢? 如何在Python中執(zhí)行SQL查詢? Aug 02, 2025 am 01:56 AM

安裝對(duì)應(yīng)數(shù)據(jù)庫(kù)驅(qū)動(dòng);2.使用connect()連接數(shù)據(jù)庫(kù);3.創(chuàng)建cursor對(duì)象;4.用execute()或executemany()執(zhí)行SQL并用參數(shù)化查詢防注入;5.用fetchall()等獲取結(jié)果;6.修改后需commit();7.最后關(guān)閉連接或使用上下文管理器自動(dòng)處理;完整流程確保安全且高效執(zhí)行SQL操作。

Python線程計(jì)時(shí)器示例 Python線程計(jì)時(shí)器示例 Jul 29, 2025 am 03:05 AM

threading.Timer可在指定延遲后異步執(zhí)行函數(shù),且不阻塞主線程,適合處理輕量級(jí)延遲或周期性任務(wù)。①基本用法:創(chuàng)建Timer對(duì)象并調(diào)用start()方法,延遲執(zhí)行指定函數(shù);②取消任務(wù):在任務(wù)執(zhí)行前調(diào)用cancel()方法可阻止執(zhí)行;③重復(fù)執(zhí)行:通過(guò)封裝RepeatingTimer類實(shí)現(xiàn)周期性運(yùn)行;④注意事項(xiàng):每個(gè)Timer開(kāi)啟新線程,應(yīng)合理管理資源,必要時(shí)調(diào)用cancel()避免內(nèi)存浪費(fèi),主程序退出時(shí)需注意非守護(hù)線程的影響,適用于延遲操作、超時(shí)處理和簡(jiǎn)單輪詢等場(chǎng)景,使用簡(jiǎn)單但非常實(shí)用。

python讀取文件示例 python讀取文件示例 Jul 30, 2025 am 03:34 AM

在Python中逐行讀取文件的推薦方法是使用withopen()和for循環(huán),1.使用withopen('example.txt','r',encoding='utf-8')asfile:可確保文件安全關(guān)閉;2.通過(guò)forlineinfile:實(shí)現(xiàn)逐行讀取,內(nèi)存友好;3.用line.strip()去除換行符和空白字符;4.指定encoding='utf-8'防止編碼錯(cuò)誤;其他技巧包括跳過(guò)空行、讀前N行、獲取行號(hào)及按條件處理行,始終避免手動(dòng)open而不close。該方法完整且高效,適用于大文件處理

如何在VSCODE中使用參數(shù)運(yùn)行Python腳本 如何在VSCODE中使用參數(shù)運(yùn)行Python腳本 Jul 30, 2025 am 04:11 AM

TorunaPythonscriptwithargumentsinVSCode,configurelaunch.jsonbyopeningtheRunandDebugpanel,creatingoreditingthelaunch.jsonfile,andaddingthedesiredargumentsinthe"args"arraywithintheconfiguration.2.InyourPythonscript,useargparseorsys.argvtoacce

如何在Python中的多個(gè)過(guò)程之間共享數(shù)據(jù)? 如何在Python中的多個(gè)過(guò)程之間共享數(shù)據(jù)? Aug 02, 2025 pm 01:15 PM

使用multiprocessing.Queue可在多個(gè)進(jìn)程間安全傳遞數(shù)據(jù),適合多生產(chǎn)者和消費(fèi)者的場(chǎng)景;2.使用multiprocessing.Pipe可實(shí)現(xiàn)兩個(gè)進(jìn)程間的雙向高速通信,但僅限兩點(diǎn)連接;3.使用Value和Array可在共享內(nèi)存中存儲(chǔ)簡(jiǎn)單數(shù)據(jù)類型,需配合Lock避免競(jìng)爭(zhēng)條件;4.使用Manager可共享復(fù)雜數(shù)據(jù)結(jié)構(gòu)如列表和字典,靈活性高但性能較低,適用于復(fù)雜共享狀態(tài)的場(chǎng)景;應(yīng)根據(jù)數(shù)據(jù)大小、性能需求和復(fù)雜度選擇合適方法,Queue和Manager最適合初學(xué)者使用。

See all articles