Python使用MySQLConnector/Python操作MySQL、MariaDB数据库
使用MySQL Connector/Python操作MySQL、MariaDB数据库
by:授客 QQ:1033553122
因目前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数据库的更多相关文章
- MySQL/MariaDB数据库的多表查询操作
MySQL/MariaDB数据库的多表查询操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单表查询小试牛刀 [root@node105.yinzhengjie.org.cn ...
- MySQL/MariaDB数据库的查询缓存优化
MySQL/MariaDB数据库的查询缓存优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL架构 Connectors(MySQL对外提供的交互接口,API): ...
- MySQL/MariaDB数据库的触发器
MySQL/MariaDB数据库的触发器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.触发器概述 1>.什么是触发器 触发器的执行不是由程序调用,也不是由手工启动,而是 ...
- MySQL/MariaDB数据库的性能测试
MySQL/MariaDB数据库的性能测试 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据库服务衡量指标 qps: query per second(每秒支持多少查询 ...
- MySQL/MariaDB数据库的MHA实现高可用实战
MySQL/MariaDB数据库的MHA实现高可用实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL高可用常见的解决方案 1>.Multi-Master ...
- MySQL/MariaDB数据库的PROXY实现读写分离
MySQL/MariaDB数据库的PROXY实现读写分离 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ProxySQL概述 1>.各家互联网公司读写分离的解决方案 m ...
- MySQL/MariaDB数据库的复制加密
MySQL/MariaDB数据库的复制加密 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的安全问题 1>.基于SSL复制 在默认的主从复制过程或远程连接 ...
- MySQL/MariaDB数据库的半同步复制
MySQL/MariaDB数据库的半同步复制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL半同步复制概述 1>.MySQL默认的异步复制 默认情况下,M ...
- MySQL/MariaDB数据库的主主复制
MySQL/MariaDB数据库的主主复制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主主复制概述 1>.什么是主主复制 所谓的主主复制,说白了就是两台节点互为 ...
- MySQL/MariaDB数据库的主从复制
MySQL/MariaDB数据库的主从复制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL复制概述 1>.传统扩展方式 垂直扩展(也叫向上扩展,Sacle ...
随机推荐
- numpy.squeeze()的用法
import numpy as np x = np.array([[[0], [1], [2]]]) print(x) """x= [[[0] [1] [2]]] &qu ...
- Android初识Helloworld
在Eclipse+ADT中创建HelloWorld非常简单,直接按照导航下一步就可以了.本文重点不在如何创建,而在理解HelloWorld项目的文件. HelloWorld的目录结构有: src:存放 ...
- Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...
- linux使用find和crontab命令定期清理过期文件
crontab 命令 crontab 命令是 Linux 中用来设定重复执行命令或脚本的工具.它能够在指定的时间段内,按照需求以某一时间间隔执行命令或脚本. crontab 的基本用法 crontab ...
- 安装的Android SDK下无doc文件夹问题 以及关联Android帮助文档和查看文档 以及查看在线文档
参考连接:https://blog.csdn.net/fangzicheng/article/details/78344521 https://jingyan.baidu.com/article/29 ...
- 通俗易懂详解Java代理及代码实战
一.概述 代理模式是Java常用的设计模式之一,实现代理模式要求代理类和委托类(被代理的类)具有相同的方法(提供相同的服务),代理类对象自身并不实现真正的核心逻辑,而是通过调用委托类对象的相关方法来处 ...
- 解决tomcat使用时catalina.out过大的问题
在项目上线之前需要做很多事情,其中最容易忘记的就是禁用不必要的日志和调整必要的参数. 调整参数这里主要指的是最大连接数,最小等待时间,虚拟机内存等. 而这里重点要提出的是,你需要禁用tomcat中不必 ...
- Python模块:time模块详解(转)
在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...
- Font Awesome(一套很棒的图标库)
Font Awesome 是一个非常方便的图标库.这些图标都是矢量图形,被保存在 .svg 的文件格式中.这些图标就和字体一样,你可以通过像素单位指定它们的大小,它们将会继承其父HTML元素的字体大小 ...
- es6学习笔记3--解构和对象
1.解构 在接收数据的地方(比如赋值的左边),解构使你使用模式去获取部分数据. 下面的代码是解构的一个例子: let obj = { first: 'Jane', last: 'Doe' }; let ...