(2-3)使用数据库保存数据:使用MariaDB数据库

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

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值