使用MySQL Connector/Python操作MySQLMariaDB数据库

 

by:授客 QQ1033553122

因目前MySQLdb并不支持python3.x,而MySQL官方已经提供了MySQL连接器,而且已经有支持Python3.x的版本,所以使用MySQL Connector/Python来操作数据库

 

测试环境:

win7 32位

JetBrains PyCharm 4.0.5

Python版本:Python 3.3.2

Windows (x86, 32-bit), MSI Installer Python 3.3

下载地址:http://dev.mysql.com/downloads/connector/python/

网盘下载地址:http://pan.baidu.com/s/1kTRqRht

 

 

dbconfig.conf配置:

[DATABASE]
host = 192.168.1.102
port = 3306
user =  testacc
passwd = test1234
db = 1dcq
charset = utf8

 

代码实践

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
import mysql.connector
from mysql.connector import  errorcode
import configparser
import sys
from datetime import date, datetime, timedelta
 
class GetDB:
    '''配置数据库IP,端口等信息,获取数据库连接'''
    def __init__(self, ini_file):
        config = configparser.ConfigParser()
 
        # 从配置文件中读取数据库服务器IP、域名,端口
        config.read(ini_file)
        self.host = config['DATABASE']['host']
        self.port = config['DATABASE']['port']
        self.user = config['DATABASE']['user']
        self.passwd = config['DATABASE']['passwd']
        self.db = config['DATABASE']['db']
        self.charset = config['DATABASE']['charset']
 
    def get_conn(self):
        try:
            conn = mysql.connector.connect(host=self.host, port=self.port, user=self.user, password=self.passwd, database=self.db, charset=self.charset)
            return conn
        except Exception as e:
            print('%s', e)
            sys.exit()
 
    # 创建数据库
    def create_database(self, cursor, db_name):
        try:
            cursor.execute("CREATE DATABASE IF NOT EXISTS {} DEFAULT CHARSET 'utf8'".format(db_name))
        except mysql.connector.Error as err:
            print('Failed creating database: {}'.format(err))
            exit(1)
 
    # 切换数据库
    def use_database(self, cursor, db_name):
        try:
            cursor.execute('USE {}'.format(db_name))
        except mysql.connector.Error as err:
            if err.errno == errorcode.ER_BAD_DB_ERROR: # ER_BAD_DB_ERROR 未知数据库
                self.create_database(cursor, db_name)
                cursor.execute('USE {}'.format(db_name))
            else:
                print(err)
                exit(1)
 
    # 创建表-批量创建(如果表直接存在依赖关系,但是执行时未对传入的tables字典参数的项进行排序,可能无法创建成功)
    def create_table(self, cursor, tables):
        for table_name, table_ddl in tables.items():
            try:
                print("Creating table {}:".format(table_name), end='')
                cursor.execute(table_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')
 
    # 创建表
    def create_table(self, cursor, table_ddl):
        try:
            print('Result of creating table:', end='')
            cursor.execute(table_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')
 
    # 插入数据
    def insert_data(self, cursor, insert_ddl, insert_data):
        try:
            cursor.execute(insert_ddl, insert_data)
            print('insert data into table success')
        except mysql.connector.Error as err:
            print('insert data into table failed')
            print(err)
 
    # 查询数据
    def query_data(self, cursor, query_ddl, query_data=None):
        try:
            if query_data:
                cursor.execute(query_ddl, query_data)
            else:
                cursor.execute(query_ddl)
            for row in cursor:
                print(row)
        except mysql.connector.Error as err:
            print(err)
 
if __name__ == '__main__':
    db = GetDB('./dbconfig.conf')
    dbconn = db.get_conn()
    cursor = dbconn.cursor()
    DB_NAME = 'employees'
 
    TABLES = {}
    TABLES['employees'] = (
        "CREATE TABLE `employees` ("
        "  `emp_no` int(11) NOT NULL AUTO_INCREMENT,"
        "  `birth_date` date NOT NULL,"
        "  `member_name` varchar(14) 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` int(11) NOT NULL,"
        "  `dept_name` varchar(40) NOT NULL,"
        "  PRIMARY KEY (`dept_no`), UNIQUE KEY `dept_name`(`dept_name`)"
        ") ENGINE=InnoDB")
 
    db.create_database(cursor, 'testdb')
 
    db.use_database(cursor, DB_NAME)
    #db.create_table(cursor, TABLES)
 
    print('creating table employees')
    db.create_table(cursor, TABLES['employees'])
    print('creating table departments')
    db.create_table(cursor, TABLES['departments'])
 
    tomorrow = datetime.now().date() + timedelta(days=1)
 
    add_employee = ("INSERT INTO employees "
                    "(member_name, hire_date, gender, birth_date) "
                    "VALUES (%s, %s, %s, %s)")
 
    add_departments = ("INSERT INTO departments "
                       "(dept_no, dept_name) "
                       "VALUES (%(dept_no)s, %(dept_name)s)")
 
    data_employee = ('Geert', tomorrow, 'M', date(1977, 6, 14))
 
    # Insert new employee
    db.insert_data(cursor, add_employee, data_employee)
 
    # Insert departments information
    emp_no = cursor.lastrowid
    data_departments = {
      'dept_no': emp_no,
      'dept_name': 'computer'+ str(emp_no)
    }
    db.insert_data(cursor, add_departments, data_departments)
 
    # 使插入数据操作生效
    try:
        dbconn.commit()
    except Exception as e:
        print(e)
        dbconn.rollback()
 
    query = ("SELECT member_name, hire_date FROM employees "
             "WHERE hire_date BETWEEN %s AND %s")
 
    hire_start = date(2015, 1, 1)
    hire_end = date(2016, 1, 10)
    db.query_data(cursor, query,(hire_start, hire_end))
 
    # 关闭游标
    cursor.close()
 
    # 关闭数据库连接
    dbconn.close()
 
注:其它操作和MYSQLdb类似,不再赘述,烦请参考文章:Python2.7操作Mariadb、Mysql数据库简介
 
运行结果:

 


参考连接:

http://dev.mysql.com/doc/connector-python/en/

http://dev.mysql.com/doc/connector-python/en/connector-python-examples.html

Python使用MySQLConnector/Python操作MySQL、MariaDB数据库的更多相关文章

  1. MySQL/MariaDB数据库的多表查询操作

    MySQL/MariaDB数据库的多表查询操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单表查询小试牛刀 [root@node105.yinzhengjie.org.cn ...

  2. MySQL/MariaDB数据库的查询缓存优化

    MySQL/MariaDB数据库的查询缓存优化 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL架构 Connectors(MySQL对外提供的交互接口,API): ...

  3. MySQL/MariaDB数据库的触发器

    MySQL/MariaDB数据库的触发器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.触发器概述 1>.什么是触发器 触发器的执行不是由程序调用,也不是由手工启动,而是 ...

  4. MySQL/MariaDB数据库的性能测试

      MySQL/MariaDB数据库的性能测试 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据库服务衡量指标 qps: query per second(每秒支持多少查询 ...

  5. MySQL/MariaDB数据库的MHA实现高可用实战

      MySQL/MariaDB数据库的MHA实现高可用实战 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL高可用常见的解决方案 1>.Multi-Master ...

  6. MySQL/MariaDB数据库的PROXY实现读写分离

    MySQL/MariaDB数据库的PROXY实现读写分离 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ProxySQL概述 1>.各家互联网公司读写分离的解决方案 m ...

  7. MySQL/MariaDB数据库的复制加密

      MySQL/MariaDB数据库的复制加密 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的安全问题 1>.基于SSL复制 在默认的主从复制过程或远程连接 ...

  8. MySQL/MariaDB数据库的半同步复制

      MySQL/MariaDB数据库的半同步复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL半同步复制概述 1>.MySQL默认的异步复制 默认情况下,M ...

  9. MySQL/MariaDB数据库的主主复制

      MySQL/MariaDB数据库的主主复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主主复制概述 1>.什么是主主复制 所谓的主主复制,说白了就是两台节点互为 ...

  10. MySQL/MariaDB数据库的主从复制

     MySQL/MariaDB数据库的主从复制  作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL复制概述 1>.传统扩展方式 垂直扩展(也叫向上扩展,Sacle ...

随机推荐

  1. 通过XMLHttpRequest和jQuery两种方式实现ajax

    一.XMLHttpRequest实现获取数据 不使用jQuery实现页面不刷新获取内容的方式,我们这里采用XMLHttpRequest原生代码实现:js代码如下: //1.获取a节点,并为其添加Onc ...

  2. Vue中使用watch来监听数据变化

    写法一: methods:{ //监听isMD upProp(){ if(this.isMD){//如果isMD等于true 就把storeManagerName赋值给isStoreManagerNa ...

  3. [java初探05]__数组的简单认识及Arrays类的常用方法

    数组是具有相同数据类型的一组数据的集合.在程序设计中,这样的集合称之为数组.数组的每个元素都具有相同的数据类型,在Java中数组也被看为一个对象. 在里,了解了数组的定义之后, 我们知道了,数组并不是 ...

  4. PHP多进程系列笔记(二)

    上一篇文章讲解了pcntl_fork和pcntl_wait两个函数的使用,本篇继续讲解PHP多进程相关新知识. 僵尸(zombie)进程 这里说下僵尸进程: 僵尸进程是指的父进程已经退出,而该进程de ...

  5. 音频播放封装(pcm格式,Windows平台 c++)

    介绍 pcm格式是音频非压缩格式.如果要对音频文件播放,需要先转换为pcm格式. windows提供了多套函数用于播放,本文介绍Waveform Audio Functions系列函数. 原始的播放函 ...

  6. JavaScript创建对象的方法汇总

    JavaScript中的对象 ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”严格来讲,这就相当于说对象是一组没有特性顺序的值.对象的每一个属性或方法都有一个名字 ...

  7. Java多线程同步集合--并发库高级应用

    一.阻塞队列1.在多线程领域,所谓阻塞,在某些情况下会挂起线程,一旦条件满足,被挂起的线程又会自动被唤醒2.ArrayBlockingQueue(效率高)和LinkedBlockingQueue是两个 ...

  8. css box-reflect投影实例讲解

    box-reflect一共有以下几个属性: above: 指定倒影在对象的上边 below: 指定倒影在对象的下边 left: 指定倒影在对象的左边 right: 指定倒影在对象的右边 offset: ...

  9. scala-传名函数和传值函数

    Scala的解释器在解析函数参数(function arguments)时有两种方式:先计算参数表达式的值(reduce the arguments),再应用到函数内部:或者是将未计算的参数表达式直接 ...

  10. SpringCloud入门之Maven系统安装及配置

    一.Maven 介绍 这个单词中文翻译为“专家”或“内行”.下面将向你介绍 Maven这一跨平台的项目管理工具.作为 Apache 组织中的一个成功的开源项目,Maven 主要服务于基 Java 平台 ...