用python和mysql.connector操作mysql


使用python和mysql官方提供驅動對數據庫進行操作。

環境

windows7 64位

python 3.4.3

mysql5.0

下載安裝驅動

驅動下載地址: http://dev.mysql.com/downloads/connector/python/

請根據自己的操作系統和python版本下載相應驅動。

我在win7下安裝驅動的時候提示我找不到python環境,要求python必須是通過msi直接安裝才可以。

沒辦法,卸載重新安裝了才可以。

連接數據庫

介紹這里mysql.connector支持的數據庫連接方式。

使用connect()構造器創建連接:

Python

import mysql.connector

# Connect with the MySQL Server
cnx = mysql.connector.connect(user='root', password='zhyea.com', host='127.0.0.1', database='test') cnx.close()
import mysql.connector
 
# Connect with the MySQL Server
cnx = mysql.connector.connect(user='root',                               password='zhyea.com',                               host='127.0.0.1',                               database='test') cnx.close() 

也可以使用connection.MySQLConnection()類:

Python

from mysql.connector import (connection) # Connect with the MySQL Server cnx = connection.MySQLConnection(user='root', password='zhyea.com', host='127.0.0.1', database='test') cnx.close()
from mysql.connectorimport (connection)
 
# Connect with the MySQL Server cnx = connection.MySQLConnection(user='root',                                 password='zhyea.com',                                 host='127.0.0.1',                                 database='test') cnx.close() 

上面提到的兩種方案都是可行的,而且性能一樣。但是connect()用得更多一些,我個人也比較喜歡這種方式。

要處理連接異常的話,可以使用try/catch聲明來捕捉異常:

Python

import mysql.connector
from mysql.connector import errorcode # Connect with the MySQL Server try: cnx = mysql.connector.connect(user='root', password='zhyea.com', host='127.0.0.1', database='test11') except mysql.connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("Something is wrong with your user name and password") elif err.errno == errorcode.ER_BAD_DB_ERROR: print("Database dosen't exist") else: print(err) else: cnx.close()
import mysql.connector
from mysql.connectorimport errorcode   # Connect with the MySQL Server try:     cnx = mysql.connector.connect(user='root',                                   password='zhyea.com',                                   host='127.0.0.1',                                   database='test11') except mysql.connector.Erroras err:     if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:         print("Something is wrong with your user name and password")     elif err.errno == errorcode.ER_BAD_DB_ERROR:         print("Database dosen't exist")     else:         print(err) else:     cnx.close() 

如果連接參數很多的話,可以使用字典和**操作符:

Python

import mysql.connector
from mysql.connector import errorcode # Connect with the MySQL Server config = { 'user' : 'root', 'password' : 'zhyea.com', 'host' : '127.0.0.1', 'database' : 'test1' } try: cnx = mysql.connector.connect(**config) except mysql.connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("Something is wrong with your user name and password") elif err.errno == errorcode.ER_BAD_DB_ERROR: print("Database dosen't exist") else: print(err) else: cnx.close()
import mysql.connector
from mysql.connectorimport errorcode   # Connect with the MySQL Server config = {           'user' : 'root',           'password' : 'zhyea.com',           'host' : '127.0.0.1',           'database' : 'test1'         } try:     cnx = mysql.connector.connect(**config) except mysql.connector.Erroras err:     if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:         print("Something is wrong with your user name and password")     elif err.errno == errorcode.ER_BAD_DB_ERROR:         print("Database dosen't exist")     else:         print(err) else:     cnx.close() 

創建表結構

所有的DDL聲明都是通過cursor完成的。

在下面的示例中描述了如何使用mysql.connector和python完成表的創建。

Python

from __future__ import print_function import mysql.connector from mysql.connector import errorcode # 數據庫名稱 DB_NAME = 'employees' # 建表語句字典 TABLES = {} TABLES['employees'] = ( "CREATE TABLE <pre class="inline:true decode:1 " >employees
from __future__ import print_function
 
import mysql.connector
from mysql.connectorimport errorcode
 
# 數據庫名稱
DB_NAME = 'employees'
 
# 建表語句字典
TABLES = {}
TABLES['employees'] = (
    "CREATE TABLE <pre class="inline:true decode:1 " >employees 

(”

” emp_no int(11) NOT NULL AUTO_INCREMENT,”

” birth_date date NOT NULL,”

” first_name varchar(14) NOT NULL,”

” last_name varchar(16) NOT NULL,”

” gender enum(‘M’,’F’) NOT NULL,”

” hire_date date NOT NULL,”

” PRIMARY KEY ( emp_no )”

“) ENGINE=InnoDB”)

TABLES[‘departments’] = (

“CREATE TABLE departments (”

” dept_no char(4) NOT NULL,”

” dept_name varchar(40) NOT NULL,”

” PRIMARY KEY ( dept_no ), UNIQUE KEY dept_name ( dept_name )”

“) ENGINE=InnoDB”)

# 創建連接對象

try:

cnx = mysql.connector.connect(user=’root’, password=’zhyea.com’)

except mysql.connector.Error as err:

if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:

print(“Something is wrong with your user name and password!”)

exit(1)

else:

print(err)

cursor = cnx.cursor()

# 創建數據庫的方法

def create_database(cursor):

try:

cursor.execute(“create database {} default character set ‘utf8′”.format(DB_NAME))

except mysql.connector.Error as err:

print(“Failed to create database: {}”.format(err))

exit(1)

# 設置連接對象中的數據庫,如果發生異常,根據異常號碼進行判斷,如果數據庫不存在則創建數據庫

try:

cnx.database = DB_NAME

except mysql.connector.Error as err:

if err.errno == errorcode.ER_BAD_DB_ERROR:

create_database(cursor)

cnx.database = DB_NAME

else:

print(err)

exit(1)

# 循環執行建表語句

for name, ddl in TABLES.items():

try:

print(“Creating table {}:”.format(name), end=”)

cursor.execute(ddl)

except mysql.connector.Error as err:

if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:

print(“already exists!”)

else:

print(err.msg)

else:

print(“OK”)

cursor.close()cnx.close()

插入數據

mysql中數據的插入和更新同樣是由cursor完成的。如果使用的是事務存儲引擎(比如Innodb),在插入、更新和刪除聲明后需要進行commit。

下面的示例演示了如何插入新數據.

Python

from __future__ import print_function
from datetime import date, datetime, timedelta 
import mysql.connector
from mysql.connector import errorcode
from distutils.command.config import config

# 連接信息 config = { 'user' : 'root', 'password' : 'zhyea.com', 'host' : '127.0.0.1', 'database' : 'employees' } # 創建連接對象 try: cnx = mysql.connector.connect(**config) except mysql.connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("Something is wrong with your user name and password!") exit(1) else: print(err) else: print("Connect OK!") # 獲取cursor cursor = cnx.cursor() # 獲取明天的時間 tomorrow = datetime.now().date() + timedelta(days=1) # 插入員工信息語句 add_employee = ("INSERT INTO employees " "(first_name, last_name, hire_date, gender, birth_date) " "VALUES (%s, %s, %s, %s, %s)") # 插入薪資信息語句 add_salary = ("INSERT INTO salaries " "(emp_no, salary, from_date, to_date) " "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)") # 員工信息 data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14)) # 插入新的員工記錄 cursor.execute(add_employee, data_employee) # 獲取剛插入的記錄的ID emp_no = cursor.lastrowid # 薪資數據 data_salary = { 'emp_no': emp_no, 'salary': 50000, 'from_date': tomorrow, 'to_date': date(9999, 1, 1) } # 插入薪資記錄 cursor.execute(add_salary, data_salary) # 保證數據已經提交到數據庫 cnx.commit() # 釋放資源 cursor.close() cnx.close()
from __future__ import print_function
from datetime import date, datetime, timedelta
import mysql.connector
from mysql.connectorimport errorcode
from distutils.command.config import config
 
# 連接信息 config = {         'user' : 'root',         'password' : 'zhyea.com',         'host' : '127.0.0.1',         'database' : 'employees'     }   # 創建連接對象 try:     cnx = mysql.connector.connect(**config) except mysql.connector.Erroras err:     if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:         print("Something is wrong with your user name and password!")         exit(1)     else:         print(err) else:     print("Connect OK!")   # 獲取cursor cursor = cnx.cursor()   # 獲取明天的時間 tomorrow = datetime.now().date() + timedelta(days=1)   # 插入員工信息語句 add_employee = ("INSERT INTO employees "               "(first_name, last_name, hire_date, gender, birth_date) "               "VALUES (%s, %s, %s, %s, %s)") # 插入薪資信息語句 add_salary = ("INSERT INTO salaries "               "(emp_no, salary, from_date, to_date) "               "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)") # 員工信息 data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14))   # 插入新的員工記錄 cursor.execute(add_employee, data_employee) # 獲取剛插入的記錄的ID emp_no = cursor.lastrowid # 薪資數據 data_salary = {               'emp_no': emp_no,               'salary': 50000,               'from_date': tomorrow,               'to_date': date(9999, 1, 1)             }   # 插入薪資記錄 cursor.execute(add_salary, data_salary)   # 保證數據已經提交到數據庫 cnx.commit()   # 釋放資源 cursor.close() cnx.close() 

執行查詢

以下演示了如何使用cursor()方法執行查詢操作。

查詢后的結果經過格式處理后打印在控制台上。

Python

'''
Created on 2015年8月10日
@author: robin
'''
import datetime import mysql.connector from mysql.connector import errorcode # 連接信息 config = { 'user' : 'root', 'password' : 'zhyea.com', 'host' : '127.0.0.1', 'database' : 'employees' } # 創建連接對象 try: cnx = mysql.connector.connect(**config) except mysql.connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("Something is wrong with your user name and password!") exit(1) else: print(err) else: print("Connect OK!") # 獲取cursor cursor = cnx.cursor() # 查詢語句 query = ("SELECT first_name, last_name, hire_date FROM employees " "WHERE hire_date BETWEEN %s AND %s") # 獲取雇佣日期 hire_start = datetime.date(1999, 1, 1) hire_end = datetime.date(2016, 12, 31) # 執行查詢語句 cursor.execute(query, (hire_start, hire_end)) # 打印查詢結果 for (first_name, last_name, hire_date) in cursor: print("{}, {} was hired on {:%d %b %Y}".format(first_name, last_name, hire_date)) # 釋放資源 cursor.close() cnx.close()
'''
Created on 2015年8月10日
@author: robin
'''
import datetime import mysql.connector from mysql.connectorimport errorcode   # 連接信息 config = {         'user' : 'root',         'password' : 'zhyea.com',         'host' : '127.0.0.1',         'database' : 'employees'     }   # 創建連接對象 try:     cnx = mysql.connector.connect(**config) except mysql.connector.Erroras err:     if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:         print("Something is wrong with your user name and password!")         exit(1)     else:         print(err) else:     print("Connect OK!")   # 獲取cursor cursor = cnx.cursor() # 查詢語句 query = ("SELECT first_name, last_name, hire_date FROM employees "         "WHERE hire_date BETWEEN %s AND %s")   # 獲取雇佣日期 hire_start = datetime.date(1999, 1, 1) hire_end = datetime.date(2016, 12, 31) # 執行查詢語句 cursor.execute(query, (hire_start, hire_end)) # 打印查詢結果 for (first_name, last_name, hire_date) in cursor:     print("{}, {} was hired on {:%d %b %Y}".format(first_name, last_name, hire_date))   # 釋放資源 cursor.close() cnx.close() 

最后展示下輸出結果:

在django中使用的配置

Python

DATABASES = {
   'default': {   'ENGINE': 'mysql.connector.django',   'NAME': 'mytest',   'USER': 'root',   'PASSWORD': 'zhyea.com',   'HOST': '127.0.0.1',   'PORT': '3306',   }   }
DATABASES = {
  'default': {
        'ENGINE': 'mysql.connector.django',
        'NAME': 'mytest',
        'USER': 'root',
        'PASSWORD': 'zhyea.com',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
 }

將這個方案列在這里是給大家一些提示。由於mysql對django的支持並不是實時的,因此1.8版本的diango在使用的時候還是會報錯。這里有一個mysql對應django1.8的bug文檔:https://dev.mysql.com/doc/connector-python/en/connector-python-installation-source-unix.html

因此使用django時,建議使用“ django . db . backends . mysql ”。

參考文檔: http://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM