Python与数据库[1] -> 数据库接口/DB-API -> MySQL 适配器

MySQL适配器 / MySQL Adapter



MySQL是一种关系型数据库,下面主要介绍利用如何利用Python的MySQL适配器来对MySQL进行操作,其余内容可参考文末相关阅读。

1 MySQL环境配置 / Environment Configuration

安装MySQL

首先在官网下载对应版本的MySQL,在安装过程中会要求Visual Studio 201x的安装环境,可前往下载Visual Studio 2015版本,安装完毕后重启完成MySQL安装。

配置MySQL

  1. 在安装目录下找到配置文件,my-default.ini,重命名为my.ini;
  2. 在环境变量中添加MySQL路径(eg.:C:\Program Files\MySQL\MySQL Server 5.7\bin);
  3. 安装MySQL服务,管理员模式打开cmd,执行命令mysqld –install MySQL –defaults-file=”my.ini”,看到提示Service Successfully installed表示安装成功。

Note: 可使用bat完成第3步操作

mysqld --install MySQL --defaults-file="my.ini"  

MySQL服务的启动、停止和卸载

在cmd下运行:

启动: net start MySQL

停止: net stop MySQL

卸载: sc delete MySQL

MySQL登录

直接操作MySQL,无需适配器,

cmd登录本地MySQL: MySQL -u username -p[ db_name] (then input your password)

2 MySQLdb适配器 / MySQLdb Adaptor

以MySQLdb适配器为例,连接MySQL数据库。

2.1 安装MySQLdb / Install MySQLdb

安装Python对MySQL的适配器,可使用pip进行安装,Python 2可安装MySQL-python,而对于Python 3需安装mysqlclient。

pip install mysqlclient  

2.2 DB-API扩展 / DB-API Extension

这部分内容为在通用标准基础上额外扩展的 API 接口。

2.2.1 query()方法

函数调用: cnx.query(sql)

函数功能:发送SQL语句进行执行

传入参数: sql

sql: str类型,需要执行的SQL语句

返回参数:

2.2.2 store_result ()方法

函数调用: rst = cnx.store_result()

函数功能:一般在query()发送SQL的请求命令之后,用于保存返回信息

传入参数:

返回参数: rst

rst: obj类型,一个数据结果对象

2.2.3 fetch_row ()方法

函数调用: r = rst.fetch_row(size, type=0)

函数功能:用于从保存的返回信息中获取结果

传入参数: size, type

size: int类型,获取数据数量,0则获取所有数据

type: int类型,0则返回的每条结果为元组,标准DB规定,1为字典,2为老式字典形式,不推荐使用

返回参数: r

r: tuple类型,包含获取的结果信息

3 适配器构建示例 / Adaptor Build Example

下面的例子将以MySQL的操作语句为例,构建一个适用于MySQL数据库的适配器,以root权限登录并进行一系列操作。

  1 class SqlConnector():
  2     def __init__(self, adaptor):
  3         self.adaptor = adaptor
  4         self.result = None
  5         # Check Adaptor info
  6         print(‘Adaptor %s apply DB-API %s, thread safety: %d, parameter style: %s‘ % (adaptor.__name__, adaptor.apilevel, adaptor.threadsafety, adaptor.paramstyle))
  7
  8     # Login by user name and password
  9     def login(self, host=‘localhost‘, user=‘root‘, password=‘root‘, **kwargs):
 10         # Create a connection obj
 11         self.cnx = self.adaptor.connect(host=host, user=user, password=password, **kwargs)
 12
 13     def logoff(self):
 14         self.cnx.close()
 15
 16     def query_sql(self, sql, show=True):
 17         # Method one: Use Connection
 18         ‘‘‘
 19         self.cnx.query(sql)
 20         self.result = self.cnx.store_result()
 21         self.cnx.commit()
 22         r = self.result.fetch_row(0, )
 23         ‘‘‘
 24         # Method two: Use Cursor
 25         cur = self.cnx.cursor()
 26         cur.execute(sql)
 27         self.cnx.commit()
 28         r = cur.fetchall()
 29         cur.close()
 30
 31         if show:
 32             splt = ‘\n‘ + ((len(sql)+6)*‘-‘)
 33             msg = ‘‘.join((‘\n{: ^10} | ‘).format(str(i)) if x.index(i) == 0 else (‘{: ^10} | ‘).format(str(i)) for x in r for i in x)
 34             s = (‘{:-^%d}‘%(len(sql)+6)).format(sql) + msg + splt
 35             print(s)
 36         return (i for x in r for i in x)
 37
 38     def exec_sql(self, sql):
 39         cur = self.cnx.cursor()
 40         cur.execute(sql)
 41         self.cnx.commit()
 42         cur.close()
 43
 44     def create_try(self, sql_create, sql_drop, name):
 45         try:
 46             self.exec_sql(sql_create)
 47             print(‘%s create success‘ % name)
 48         # MySQLdb.ProgrammingError or MySQLdb.OperationalError
 49         except:
 50             r = input(‘%s may exist, delete and create a new one?[y/n]‘ % name)
 51             if r == ‘n‘:
 52                 print(‘Failed to create %s‘ % name)
 53                 return False
 54             try:
 55                 self.exec_sql(sql_drop)
 56                 print(‘%s delete success‘ % name)
 57                 self.exec_sql(sql_create)
 58                 print(‘%s create success‘ % name)
 59             except:
 60                 print(‘Failed to create %s‘ % name)
 61                 return False
 62         return True
 63
 64     # --------------- For user handle -------------------
 65     def create_user(self, usn, psw):
 66         sql = ‘CREATE USER %s IDENTIFIED BY "%s";‘ % (usn, psw)
 67         try:
 68             self.exec_sql(sql)
 69         except MySQLdb.OperationalError:
 70             print(‘Create user %s failed‘ % usn)
 71             return False
 72         return True
 73
 74     def show_grants(self, usn):
 75         sql = ‘SHOW GRANTS FOR %s;‘ % usn
 76         # re = self.query_sql(sql)
 77         self.query_sql(sql)
 78
 79     def grant_for(self, user):
 80         pass
 81
 82     # --------------- For database handle -------------------
 83     def create_database(self, db_name):
 84         # Try to CREATE a database, DELETE database if create failed
 85         # And try CREATE again, if failed again, exit
 86         # You can try ‘CREATE DATABASE IF NOT EXISTS db_name;‘ too
 87         sql_create = ‘CREATE DATABASE %s;‘ % db_name
 88         sql_drop = ‘DROP DATABASE %s;‘ % db_name
 89         return self.create_try(sql_create, sql_drop, db_name)
 90
 91     def drop_database(self, db_name):
 92         sql = ‘DROP DATABASE IF EXISTS %s;‘ % db_name
 93         self.exec_sql(sql)
 94
 95     def use_database(self, db_name):
 96         sql = ‘USE %s;‘ % db_name
 97         self.exec_sql(sql)
 98
 99     def show_databases(self):
100         sql = ‘SHOW DATABASES;‘
101         re = self.query_sql(sql)
102         # print(list(re))
103
104     # --------------- For table handle -------------------
105     def create_table(self, tb_name, tb_info, db_name=None):
106         if db_name:
107             self.use_database(db_name)
108         tb_info = (‘, ‘.join(‘%s %s‘ % (k, v) for k, v in tb_info.items())).join(‘()‘)
109         sql_create = ‘CREATE TABLE %s %s;‘ % (tb_name, tb_info)
110         sql_drop = ‘DROP TABLE %s;‘ % tb_name
111         return self.create_try(sql_create, sql_drop, tb_name)
112
113     def drop_table(self, tb_name, db_name=None):
114         if db_name:
115             self.use_database(db_name)
116         sql = ‘DROP TABLE IF EXISTS %s;‘ % tb_name
117         self.exec_sql(sql)
118
119     #def use_table(self, tb_name, db_name=None):
120     #    if db_name:
121     #        self.use_database(db_name)
122     #    sql = ‘USE %s;‘ % tb_name
123     #    self.exec_sql(sql)
124
125     def show_tables(self, db_name):
126         self.use_database(db_name)
127         sql = ‘SHOW TABLES;‘
128         self.query_sql(sql)
129
130     def describe_table(self, tb_name, db_name=None):
131         if db_name:
132             self.use_database(db_name)
133         sql = ‘DESCRIBE %s;‘ % tb_name
134         self.query_sql(sql)
135
136     # --------------- For column handle -------------------
137     def insert_column(self, tb_name, value):
138         sql = ‘INSERT INTO %s VALUES %s‘ % (tb_name, value)
139         self.query_sql(sql)
140
141     def drop_columns(self, tb_name, cl_name, value):
142         if isinstance(value, str):
143             value = value.join("‘‘")
144         sql = "DELETE FROM %s WHERE %s=%s" % (tb_name, cl_name, str(value))
145         self.query_sql(sql, show=False)
146
147     def insert_columns(self, tb_name, values):
148         n = len(values[0])
149         qn = (‘, ‘.join(‘%s‘ for x in range(n))).join(‘()‘)
150         sql = ‘INSERT INTO %s VALUES%s‘ % (tb_name, qn)
151         print(sql)
152         cur = self.cnx.cursor()
153         cur.executemany(sql, values)
154         cur.close()
155
156     def show_columns(self, tb_name):
157         sql = ‘SHOW COLUMNS in %s;‘ % tb_name
158         self.query_sql(sql)
159
160     def show_all_rows(self, tb_name):
161         sql = ‘SELECT * FROM %s‘ % tb_name
162         self.query_sql(sql)
163
164     def select_row(self, tb_name, cl_name):
165         row_name = ‘, ‘.join(x for x in cl_name)
166         sql = ‘SELECT %s FROM %s‘ % (row_name, tb_name)
167         self.query_sql(sql)
168
169
170 if __name__ == ‘__main__‘:
171     import MySQLdb
172     c = SqlConnector(MySQLdb)
173     #c = SqlConnector(pyodbc)
174     c.login()
175     c.create_database(‘mysql_db‘)
176     c.use_database(‘mysql_db‘)
177     #c.create_user(‘Ericsson‘, ‘123456‘)
178     #c.show_grants(‘Ericsson‘)
179     #c.show_databases()
180     #c.drop_database(‘test_db‘)
181     c.show_databases()
182     from collections import OrderedDict
183     ord_dict = OrderedDict()
184     ord_dict[‘id‘] = ‘TINYINT‘
185     ord_dict[‘name‘] = ‘VARCHAR(8)‘
186     ord_dict[‘age‘] = ‘INT‘
187     c.create_table(‘test_tb‘, ord_dict, db_name=‘mysql_db‘)
188     c.show_tables(‘mysql_db‘)
189     c.describe_table(‘test_tb‘)
190     c.show_all_rows(‘test_tb‘)
191     c.insert_column(‘test_tb‘, (7, ‘ANAY‘, 9))
192     c.insert_columns(‘test_tb‘, [(4, ‘AX‘, 2), (5, ‘SD‘, 2), (6, ‘CSA‘, 5)])
193     c.drop_columns(‘test_tb‘, ‘name‘, ‘1‘)
194     c.show_all_rows(‘test_tb‘)
195     c.show_columns(‘test_tb‘)
196     #c.select_row(‘test_tb‘, (‘age‘, ‘name‘))
197     c.logoff()

首先建立适配器,适配器可以使用继承通用适配器中应用示例的适配器进行构建,以减少代码重复。此处未采用继承,直接进行建立。

第 1-42 行,定义适配器类的基本操作方法。

第 44-62 行,定义一个创建尝试函数,当有需要创建一个新的数据库或表格时,会进行一个创建尝试,若创建失败,则可能是由于创建对象已存在导致的,询问用户是否尝试删除原表,若是则尝试删除后再次重建。

第 64-80 行,定义用于用户管理的函数,如创建用户,查看用户权限等(其余待补充)。

第 82-102 行,定义用于创建、删除、使用及显示数据库的函数。

第 104-134行,定义用于创建、删除、显示表的函数。

第 136-167 行,定义用于插入(多)、删除、显示列的函数,以及显示表内数据的函数。

第 171-181 行,执行函数,首先创建表,并选择使用创建的表,

第 182-183 行,此处由于字典的无序性,会导致列顺序无法确定,因此引入了有序字典。

第 184-197 行,对表进行一系列操作,并最终退出登录。

最终输出结果如下,

Adaptor MySQLdb apply DB-API 2.0, thread safety: 1, parameter style: format
mysql_db may exist, delete and create a new one?[y/n]y
mysql_db delete success
mysql_db create success
---SHOW DATABASES;---
information_schema |
my_database |
my_schema  |
  mysql    |
 mysql_db  |
performance_schema |
  sakila   |
   sys     |
 test_db   |
  world    |
---------------------
test_tb create success
---SHOW TABLES;---
 test_tb   |
------------------
---DESCRIBE test_tb;---
    id     | tinyint(4) |    YES     |            |    None    |            |
   name    | varchar(8) |    YES     |            |    None    |            |
   age     |  int(11)   |    YES     |            |    None    |            |
-----------------------
---SELECT * FROM test_tb---
---------------------------
---INSERT INTO test_tb VALUES (7, ‘ANAY‘, 9)---
-----------------------------------------------
INSERT INTO test_tb VALUES(%s, %s, %s)
---SELECT * FROM test_tb---
    7      |    ANAY    |     9      |
    4      |     AX     |     2      |
    5      |     SD     |     2      |
    6      |    CSA     |     5      |
---------------------------
---SHOW COLUMNS in test_tb;---
    id     | tinyint(4) |    YES     |            |    None    |            |
   name    | varchar(8) |    YES     |            |    None    |            |
   age     |  int(11)   |    YES     |            |    None    |            |
------------------------------

至此,利用 Python 完成了一个简单的数据库适配器。

相关阅读



1. 数据库概述

2. DB-API 通用标准

参考链接



http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html

http://jingyan.baidu.com/article/414eccf612e0c16b431f0a95.html

原文地址:https://www.cnblogs.com/stacklike/p/8178748.html

时间: 2024-11-10 14:30:50

Python与数据库[1] -> 数据库接口/DB-API -> MySQL 适配器的相关文章

Python与数据库[1] -> 数据库接口/DB-API -> SQL Server 适配器

SQL_Server适配器 / SQL_Server Adapter 1 环境配置 / Environment Configuration 安装SQL_Server的Python适配器包 pip install pymssql Note: 此处采用远程数据库服务器,因此未安装本地SQL_Server 2 SQL_Server实例 / SQL_Server Examples 由于远程数据库账号仅具有读取权限,因此此处示例基本以读取为主. 查看数据库 / Show Database 利用适配器的基本

Python与数据库[1] -> 数据库接口/DB-API -> 通用标准

数据库接口 / DB-API 在Python中,数据库是通过适配器(Adaptor)来连接访问数据库的,适配器通常与数据库客户端接口(通常为C语言编写)想连接,而不同的适配器都会尽量满足相同的DB-API标准. 为了保证不同数据库的数据库接口能够通用于适配器,以减少使用不同数据库接口是需要对代码进行大幅改动,Python的DB-SIG(数据库特殊兴趣小组)制定了DB-API的标准,该API为不同的关系数据库提供了一致的接口,使得使用不同数据库的代码间移植变得更加简单.数据库接口目前的版本为DB-

Python与数据库[1] -> 数据库接口/DB-API -> ODBC 适配器

ODBC适配器 / ODBC Adaptor ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口).这些API利用SQL来完成其大部分任务.ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC. 1 ODBC环境配置 / ODBC Confi

Python DB API 连接数据库

Python DB API Mysql,Oracle,SqlServer 不关闭,会浪费资源. 原文地址:https://www.cnblogs.com/jiqing9006/p/9713716.html

Python学习—数据库操作

python2中操作数据库:MySQLdbpython3中操作数据库:pymysql python接连数据库 1.创建数据库连接: mysql.connect()函数 2.执行数据库操作:执行数据库操作,我们要使用连接对象获得一个cursor(游标)对象: 用连接对象的cursor()方法返回一个游标对象 接下来,我们会使用cursor提供的方法来进行工作. 这些方法包括两大类:1.执行命令,2.接收返回值 执行命令: callproc(self, procname, args):用来执行存储过

Python学习笔记_02:使用Tkinter连接MySQL数据库实现登陆注册功能

1 环境搭建 1.1 Python安装 1.2 MySQL环境搭建 1.3安装MySQLdb  2 具体实现 2.1 登陆界面 2.2 注册界面 2.3 具体实现部分代码   1 环境搭建 1.1 Python安装 本文具体实现部分Python环境:Python2.7.14,64位版本 具体安装步骤见:Python 环境搭建 附:配置PythonIDE,推荐PyCharm(具体IDE界面见下图),下载点击运行即可使用 PyCharm 官方下载地址:http://www.jetbrains.com

Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案

Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案 1. 跨语言db api兼容性..1 2. 目前访问数据库的接口很多.比较常用的jdbc odbc 以及c api (php用此接口),共约101个类+128个c函数1 2.1. Jdbc api数量  约60个类..java.sql包下面的..大概几百个方法函数吧..2 2.2. Odbc api数量::约78个,odbc是个非oo的api2 2.3. C api (mysql ): 约50个..

Python+Django+SAE系列教程12-----配置MySQL数据库

因为SAE上支持的是Mysql,首先我们要在本地配置一个Mysql的环境 ,我在网上找到MySQL-python-1.2.4b4.win32-py2.7.exe,并双击 安装 选择典型安装 安装结束后,会弹出配置数据库的界面 : 然后输数据管理员密码: 最后是运行服务. 这个过程并不复杂,安装完成Mysql以后,系统会启动数据库服务,由于Mysql是用命令行控制的,想我这样懒的 人还是需要借助一个可视化 工具来管理,我选择MySQL-Front. 在网上找到MySQL_Front_Setup.1

python3+Django1.11+mysql5.7 MySQL DB API Drivers

The Python Database API is described in PEP 249. MySQL has three prominent drivers that implement this API: MySQLdb is a native driver that has been developed and supported for over a decade by Andy Dustman. mysqlclient is a fork of MySQLdb which not