2.3 使用MariaDB数据库
MariaDB是一种开源数据库,是MySQL数据库的一个分支。因为某些历史原因,有不少用户担心MySQL数据库会停止开源,所以MariaDB逐步发展成为MySQL替代品的数据库工具之一。在本节的内容中,将详细讲解使用MySQL第三方库来操作MariaDB数据库的知识。
2.3.1 搭建MariaDB数据库环境
作为一款经典的关系数据库产品,搭建MariaDB数据库环境的基本流程如下所示。
(1)登录MariaDB官网下载页面https://downloads.mariadb.org/,如图2-4所示。
图2-4 MariaDB官网下载页面
(2)单击“Download 10…”按钮来到具体下载界面,如图2-5所示。在此需要根据计算机系统的版本进行下载,例如笔者的计算机是64位的Windows 10系统,所以选择“mariadb- 10.1.20-winx64.msi”进行下载。
图2-5 具体下载页面
(3)下载完成后会得到一个安装文件“mariadb-10.1.20-winx64.msi”,双击这个文件后弹出欢迎安装对话框界面。如图2-6所示。
(4)单击Next按钮后弹出用户协议对话框界面,在此勾选“I accept…”复选框,如图2-7所示。
图2-6 欢迎安装对话框界面 图2-7 用户协议对话框界面
(5)单击Next按钮后弹出典型设置对话框界面,在此设置程序文件的安装路径,如图2-8所示。
(6)单击Next按钮后弹出设置密码对话框界面,在此设置管理员用户“root”的密码,如图2-9所示。
(7)单击Next按钮后弹出默认实例属性对话框界面,在此设置服务器名字和TCP端口号,如图2-10所示。
(8)单击Next按钮来到准备安装对话框界面,如图2-11所示。
图2-8 典型设置对话框界面 图2-9 设置密码
图2-10 默认实例属性对话框界面 图2-11 准备安装对话框界面
(9)单击Install按钮后弹出安装进度条界面,开始安装MariaDB,如图2-12所示。
(10)安装进度完成后弹出完成安装对话框界面,单击Finish按钮后完成安装。如图2-13所示。
图2-12 安装进度条界面 图2-13 完成安装对话框界面
2.3.2 在Python程序中使用MariaDB数据库
当在Python程序中使用MariaDB数据库时,需要在程序中加载Python语言的第三方库MySQL Connector Python。但是在使用这个第三方库操作MariaDB数据库之前,需要先下载并安装这个第三方库。下载并安装的过程非常简单,只需在控制台中执行如下命令即可实现。
pip install mysql-connector
例如在下面的实例文件md.py中,演示了在Python程序中使用MariaDB数据库的过程。
源码路径:codes\2\2-3\md.py
from mysql import connector
import random #导入内置模块
…省略部分代码…
if __name__ == '__main__':
print("建立连接...") #打印显示提示信息
#建立数据库连接
con = connector.connect(user='root',password=
'66688888',database='md')
print("建立游标...") #打印显示提示信息
cur = con.cursor() #建立游标
print('创建一张表mdd...') #打印显示提示信息
#创建数据库表mdd
cur.execute('create table mdd(id int primary key auto_increment not null,name text,passwd text)')
#在表mdd中插入一条数据
print('插入一条记录...') #打印显示提示信息
cur.execute('insert into mdd (name,passwd)values(%s,%s)',(get_str(2,4),get_str(8,12),))
print('显示所有记录...') #打印显示提示信息
output() #显示数据库中的数据信息
print('批量插入多条记录...') #打印显示提示信息
#在表mdd中插入多条数据
cur.executemany('insert into mdd (name,passwd)values(%s,%s)',get_data_list(3))
print("显示所有记录...") #打印显示提示信息
output_all() #显示数据库中的数据信息
print('更新一条记录...') #打印显示提示信息
#修改表mdd中的一条数据
cur.execute('update mdd set name=%s where id=%s',('aaa',1))
print('显示所有记录...') #打印显示提示信息
output() #显示数据库中的数据信息
print('删除一条记录...') #打印显示提示信息
#删除表mdd中的一条数据信息
cur.execute('delete from mdd where id=%s',(3,))
print('显示所有记录:') #打印显示提示信息
output() #显示数据库中的数据信息
在上述实例代码中,使用mysql-connector-python模块中的函数connect()建立了和MariaDB数据库的连接。连接函数connect()在mysql.connector中定义,此函数的语法原型如下所示:
connect(host, port,user, password, database,charset)
q host:访问数据库的服务器主机(默认为本机);
q port:访问数据库的服务端口(默认为3306);
q user:访问数据库的用户名;
q password:访问数据库用户名的密码;
q database:访问数据库名称;
q charset:字符编码(默认为uft8)。
执行后将显示创建数据表并实现数据插入、更新和删除操作的过程。执行后会输出:
建立连接...
建立游标...
创建一张表mdd...
插入一条记录...
显示所有记录...
1 kpv lrdupdsuh
批量插入多条记录...
显示所有记录...
建立连接...
建立游标...
创建一张表mdd...
插入一条记录...
显示所有记录...
1 kpv lrdupdsuh
批量插入多条记录...
显示所有记录...
(1, 'kpv', 'lrdupdsuh')
(2, 'hsue', 'ilrleakcoh')
(3, 'hb', 'dzmcajvm')
(4, 'll', 'ngjhixta')
更新一条记录...
显示所有记录...
1 aaa lrdupdsuh
2 hsue ilrleakcoh
3 hb dzmcajvm
4 ll ngjhixta
删除一条记录...
显示所有记录:
1 aaa lrdupdsuh
2 hsue ilrleakcoh
4 ll ngjhixta
注意:在操作MariaDB数据库时,与操作SQLite3的SQL语句不同的是,SQL语句中的占位符不是“?”,而是“%s”。
2.3.3 使用MariaDB创建MySQL数据库
请看下面的实例文件123.py,功能是使用MariaDB创建一个指定的MySQL数据库。
源码路径:codes\2\2-3\123.py
import socket
import time
import pymysql as mariadb
# 设置要连接的数据库的名字
DB_NAME='mariadb'
#如果您已经注册了,请先登录。
TABLES = {}
TABLES['location'] = (
"CREATE TABLE IF NOT EXISTS `location` ("
" `id` int(255) NOT NULL AUTO_INCREMENT,"
" `latitud` varchar(15) NOT NULL,"
" `longitud` varchar(15) NOT NULL,"
" `Fecha` varchar(22) NOT NULL,"
" `Hora` varchar(22) NOT NULL,"
" PRIMARY KEY (`id`), UNIQUE KEY `Hora` (`Hora`)"
") ENGINE=InnoDB")
#使用用户名和密码连接服务器
cnx = mariadb.connect(host='localhost', user='root', password='66688888')
cursor = cnx.cursor()
# 创建数据库
def generate_database(curs):
try:
#删除已存在的数据库
# curs.execute("DROP DATABASE IF EXISTS {}".format(DB_NAME))
# 如果数据库不存在则创建他
curs.execute(
"CREATE DATABASE IF NOT EXISTS {} DEFAULT CHARACTER SET 'utf8'".format(DB_NAME))
except mariadb.Error as err:
print("Failed creating database: {}".format(err))
exit(1)
else:
print("Database OK")
try:
generate_database(cursor)
except mariadb.Error as err:
print("Error: {}".format(err))
cursor.execute("USE {}".format(DB_NAME))
for name, ddl in TABLES.items():
try:
print("Creating table {}: ".format(name), end='')
cursor.execute(ddl)
except mariadb.Error as err:
print("Failed creating table: {}".format(err))
exit(1)
else:
print("Table OK")
cnx.commit()
cnx.close()
def main():
#创建TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
HOST = socket.gethostbyname(socket.gethostname())
PORT = 10
# 绑定socket 端口
server_address = (HOST, PORT)
print('Inicializando en Host IPV4 %s Puerto %s' % server_address)
sock.bind(server_address)
while True:
try:
while True:
print("Connected")
raw_data, addr = sock.recvfrom(65535)
save_data = str(raw_data)[2:]
# 区分纬度和经度的格式,分别打印精度和维度信息,这样可以实现精准本地化功能
if raw_data:
# print('recibido ' + save_data)
op, evento, fecha, lat, lon = obtMsg(save_data);
# print(op, evento)
if op:
print('Evento: ' + str(evento) + ', ' + 'la latitud es: ' + str(lat) + ' y la longitud es: ' + str(lon))
print('Fecha del dato: ' + fecha)
# 连接数据库
cnx = mariadb.connect(host='localhost', user='root', password='66688888')
cursor = cnx.cursor()
cursor.execute("USE {}".format(DB_NAME))
# 插入数据
add_location = ("INSERT INTO location "
"(latitud, longitud, Fecha ,Hora) "
"VALUES (%s, %s, %s)")
data_location = (str(lat), str(lon), fecha, hora)
#插入新的本地化信息
cursor.execute(add_location, data_location)
cnx.commit()
cursor.close()
cnx.close()
else:
print("***********************************************")
print(" Mensaje Ignorado ")
print("***********************************************")
else:
break
finally:
print("No se estan recibiendo más datos")
def obtMsg(d):
# 注意Rev和RPV之间的区别
if d[0:4] == ">REV":
op = True
#用于打印数据(作为确认信息)
evento = int(d[4:6])
# 发布信息
fecha = obtFecha(d[6:10], d[10], d[11:16])
#将日期存储为string类型
lat = float(d[17:19]) + (float(d[19:24]) / 100000)
if d[16] == "-":
lat = -lat
lon = float(d[25:28]) + (float(d[28:33]) / 100000)
if d[24] == "-":
lon = -lon
else:
op = False
evento = 0
fecha = ' '
lat = 0
lon = 0
return op, evento, fecha, lat, lon
def obtFecha(sem,dia,hora):
seg = int(sem) * 7 * 24 * 60 * 60 + (int(dia) + 3657) * 24 * 60 * 60 + int(hora) + 5 * 60 * 60
#将数字(以秒计)转换为日期格式 %b %d %Y %M %S
#具体参考 (Vease https://docs.python.org/2/library/time.html)
# t = time.mktime(seg)
fecha = time.strftime("%b %d %Y %H:%M:%S", time.localtime(seg))
return fecha
main()
执行后会创建MySQL数据库“mariadb”,在此数据库中创建一个名为“location”的表。执行后会输出:
Database OK
Creating table location: Table OK
Inicializando en Host IPV4 192.168.1.102 Puerto 10
Connected