前言

在这一节中,我们主要介绍如何使用python操作MySQL数据库。

准备

MySQL数据库使用的是上一节中的docker容器 “test-mysql”.

Python 操作 MySQL

我们使用的IDE是 “神奇” 的 pycharm:

1. 首先新建一个python的项目,并且安装 “mysql-connector-python”。

“mysql-connector-python” 是MySQL官方对于python的数据驱动,感兴趣的童鞋可以移步这里: https://dev.mysql.com/doc/connector-python/en/

2. 创建 MySQLUtil.py

基于上一节的介绍,我们的任务是要读取FTP上的文本文件,从中解析出天气数据,并且插入到数据库表中(持久化)。因此,我们将基本的数据库操作都封装到这个python 文件中。

3.  准备工作 -- 在第一次连接的时候需要DDL操作(创建相应的数据库和表); 之后的的操作是DML(增/删/改/查)

# -*- coding: utf-8 -*-

from __future__ import print_function

import mysql.connector
from mysql.connector import errorcode config_prepare = {
'user': 'root',
'password': 'password',
'host': '127.0.0.1',
#'database': 'weather_db',
'raise_on_warnings': True,
} config_op = {
'user': 'root',
'password': 'password',
'host': '127.0.0.1',
'database': 'weather_db',
#'raise_on_warnings': True,
} def preparation(db_name='weather_db', table_name='weather'):
try:
cnx = mysql.connector.connect(**config)
except mysql.connector.Error as err:
print(err)
return (-1) # try use db or create it
try:
cursor = cnx.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS {} DEFAULT CHARACTER SET 'UTF8MB4'".format(db_name))
cnx.database = db_name
except mysql.connector.Error as err:
print(err)
#return (-2) # Create table if not exist
try:
cnx.database = db_name
cursor = cnx.cursor()
createTableSql = """CREATE TABLE IF NOT EXISTS `weather` ( \
`weather_timestamp` varchar(32) NOT NULL, \
`weather_data` varchar(256) NOT NULL, \
PRIMARY KEY (`weather_timestamp`) \
) ENGINE=InnoDB;""" cursor.execute(createTableSql)
cursor.close()
except mysql.connector.errorcode as err:
print(err.msg)
return (-3) print ("Preparation OK") return (0)

4. 插入或更新数据

def insert_or_update_weather_data(datas):
sql = "INSERT INTO weather(weather_timestamp, weather_data) " \
"VALUES(%s,%s)" \
"ON DUPLICATE KEY UPDATE weather_data = VALUES(weather_data);" try:
cnx = mysql.connector.connect(**config_op) cursor = cnx.cursor()
cursor.executemany(sql, datas) cnx.commit() except mysql.connector.errorcode as e:
print('Error:', e)
return (-1) finally:
cursor.close()
cnx.close() return (0)

PS: 由于天气数据是由供应商提供,提供的方式是 每日两次(早上8点;下午5点)放到FTP上面,每次提供7天的天气预报。 因此,当我们读取天气数据的时候,有一段时间的数据是重合的。因此采用插入或更新 (表中没有天气数据时:插入; 有数据时:更新)的方式来处理。

5. 根据时间条件,读取天气数据

def query_weather_data(begin_time_stamp, end_time_stamp):

    sql = "SELECT weather_timestamp, weather_data FROM weather " \
"WHERE weather_timestamp BETWEEN %s AND %s;" try:
cnx = mysql.connector.connect(**config_op) cursor = cnx.cursor()
        # The second parameter must be a tuple that contains all the delimeters

        cursor.execute(sql, (begin_time_stamp, end_time_stamp)) 
        rows = cursor.fetchall()

        return rows

    except mysql.connector.errorcode as e:
print('Error:', e)
return [] finally:
cursor.close()
cnx.close()

6. 最后附上测试代码

if __name__ == '__main__':
print("=== Unit test begin ===") # Test prepareation
nRet = preparation() # Test insert or update datas in 'weather' table
datas1 = (
('', '0.0 0.0 0.0 16.461 95.163 6.038 97.493 1013.791'),
('', '0.0 0.0 0.0 16.347 95.532 6.046 97.606 1013.713'),
('', '0.0 0.0 0.0 16.233 95.901 6.055 97.719 1013.634'),
('', '0.0 0.0 0.0 16.139 96.269 6.063 97.832 1013.556'),
)
nRet1 = insert_or_update_weather_data(datas1) datas2 = ( ('', '{data1:0.0, data2:0.0, data3:0.0, data4:16.233, data5:95.901, data6:6.055, data7:97.719, data8:1013.030}'),
('', '{data1:0.0, data2:0.0, data3:0.0, data4:11.111, data5:93.901, data6:6.099, data7:97.700, data8:1013.045}'),
)
nRet2 = insert_or_update_weather_data(datas2) # Test query data from 'weather' table
ret_list = query_weather_data('', '')
if len(ret_list) == 0:
print ("No data queried out.")
else:
for timestamp, data in ret_list:
print ('timestamp:%s data:%s' %(timestamp, data)) print("=== Unit test done ===")

小结

至此,我们操作MySQL的工具代码就全部编写完成。 在下一节中,我们将着重FTP部分的说明。

感谢大家的收看,欢迎积极留言讨论~~

python + docker, 实现天气数据 从FTP获取以及持久化(二)-- python操作MySQL数据库的更多相关文章

  1. python + docker, 实现天气数据 从FTP获取以及持久化(一)

    前情提要 最近项目需要天气数据(预报和历史数据)来作为算法程序的输入. 项目的甲方已经购买了天气数据, 依照他们的约定,天气数据的供应商会将数据以"文本" (.TXT)的方式发到F ...

  2. python + docker, 实现天气数据 从FTP获取以及持久化(五)-- 利用 Docker 容器化 Python 程序

    背景 不知不觉中,我们已经完成了所有的编程工作.接下来,我们需要把 Python 程序 做 容器化 (Docker)部署. 思考 考虑到项目的实际情况,“持久化天气”的功能将会是一个独立的功能模块发布 ...

  3. python + docker, 实现天气数据 从FTP获取以及持久化(四)-- 数据准备

    前情提要 在之前的文章里,我们已经掌握从FTP上面下载天气数据然后插入到数据库中. 但是如何将我们已有的数据放到生产环境中呢? 思考 首先,我们先简单的理一理现在的情况. 目前: FTP上面已有半个月 ...

  4. python + docker, 实现天气数据 从FTP获取以及持久化(三)-- python获取FTP数据

    前言 经过前面两个小节的介绍,我们已经完成了MySQL数据库的搭建和数据库操作的事宜. 在本小节中,我们需要完成的任务是:使用python从FTP服务其上面获取文本文件. 搭建测试FTP服务器 LZ的 ...

  5. 毕设之Python爬取天气数据及可视化分析

    写在前面的一些P话:(https://jq.qq.com/?_wv=1027&k=RFkfeU8j) 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向. ...

  6. Dapper操作MySQL数据库获取JSON数据中文乱码

    前言 在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,希望对存储JSON的童鞋能有所帮助,文中若有错误之处,还望批评指正. Dapper获取J ...

  7. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  8. python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy

    内容一览: 1.Python操作MySQL数据库 2.ORM sqlalchemy学习 1.Python操作MySQL数据库 2. ORM sqlachemy 2.1 ORM简介 对象关系映射(英语: ...

  9. 使用python操作mysql数据库

    这是我之前使用mysql时用到的一些库及开发的工具,这里记录下,也方便我查阅. python版本: 2.7.13 mysql版本: 5.5.36 几个python库 1.mysql-connector ...

随机推荐

  1. Angular单元测试

    https://angular.github.io/protractor/#/http://jasmine.github.io/2.4/introduction.html 测试程序有两种主要方法:端对 ...

  2. ARIMA模型——本质上是error和t-?时刻数据差分的线性模型!!!如果数据序列是非平稳的,并存在一定的增长或下降趋势,则需要对数据进行差分处理!ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数

    https://www.cnblogs.com/bradleon/p/6827109.html 文章里写得非常好,需详细看.尤其是arima的举例! 可以看到:ARIMA本质上是error和t-?时刻 ...

  3. vim按下ctrl+s僵死

    CTRL+S表示停止向终端停止输出 CTRL+Q恢复向终端输出流

  4. C#如何弹出输入框

    在C#中,进行windows窗体应用程序编程的时候,经常需要弹出输入框,输入密码,输入文本之类的.然而,C#中没有直接弹出输入框的语句,MessageBox只能显示一段消息而不能输入.我们需要调用Mi ...

  5. memcache+tomcat7.0.37+nginx实现session共享

    一.session工作原理 由于http是无状态的协议,当我们访问了页面A,然后访问页面B,http无法确定这2个页面的访问是来自同一个人.因此,我们要用cookie或session来跟踪用户,根据授 ...

  6. 让opencv输出人脸检测的得分(置信率)

    最近项目略多,其中一个需要找出一些和脸比较像但是不是脸的负样本,想用opencv的人脸检测器检测到的错误脸作为这样的负样本. 但是国内(包括国外)居然几乎没有相关的资料如何输出detectMultiS ...

  7. UITableView-(单元格的自定义方法)

    //contentView //行内容 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS ...

  8. Windows下Java JDK8配置环境变量

    JDK最新版已经出到了jdk8u60,下载安装完成后,还需要配置环境变量,下面小编就给大家分享下jdk 8.0的环境变量配置教程,希望大家喜欢. jdk8.0环境变量配置教程 右键选择 计算机→属性→ ...

  9. ambassador 学习四 grpc 处理

    实际上都是envoy 的功劳 基本环境安装参考相关文档即可 参考demo proto code syntax = "proto3"; option java_multiple_fi ...

  10. Linux菜鸟入门级命令大全

    1. man 对你熟悉或不熟悉的命令提供帮助解释eg:man ls 就可以查看ls相关的用法注:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止当前程序运行.2. ls 查看目录或者 ...