python和mysql(一)

python和mysql

本文想要总结python在操作mysql时遇到的一些问题。
将分成几个模块总结:

  1. mysql的安装
  2. python与mysql 的交互
  3. pandas与mysql
  4. mysql时间日期的处理
1、mysql的安装

mysql官网下载: http://dev.mysql.com/downloads/mysql/
解压缩版下载:Windows (x86, 64-bit), ZIP Archive
安装步骤很简单:
以管理员身份打开命令行,进入解压缩后的bin目录,运行命令:mysqld -install 后再运行net start mysql 启动mysql服务。

F:\Develop\Mysql\mysql-5.7.23-winx64\bin>mysqld -install
Service successfully installed.

启动mysql服务时候,很可能会出现如下错误:

F:\Develop\Mysql\mysql-5.7.23-winx64\bin>net start mysql
MySQL 服务正在启动 .
MySQL 服务无法启动。
服务没有报告任何错误。
请键入 NET HELPMSG 3534 以获得更多的帮助。

这是因为,在mysql5.7以上版本中默认没有一个data目录,即没有初始化服务。需要先初始化mysql才可以启动服务。
可以先在mysql的bin目录下执行mysqld --initialize-insecure命令,
若已经执行过net start mysql,删除data文件,重新执行mysqld --initialize-insecure

登陆mysql

首次登陆:mysql –u root –p 不需要密码,但是进入mysql之后,需要修改密码以免影响后续的操作。SET PASSWORD = PASSWORD('new password');
你可以添加bin的目录进环境变量,这样方便你在任何位置通过命令行窗口进入mysql。

2、python与mysql的交互

我用的是Python3。(直接下载的 anacoda 3.6版本,用pycharm 做IDE,用起来蛮顺手的。anacoda包含很多python的常用包,下载anacoda安装之后就无须再下载python了。)
python3 与MySQL交互要用到pymysql模块。使用该模块之前,需要先进行安装。
说一下pycharm怎么安装模块:
新建好项目之后,通过file->settings->找到自己的项目的project Interpreter,点击右侧的绿色“+”号,输入模块名称,点击左下角的 install 即可安装。

这里写图片描述
这里写图片描述

安装时,我遇到HTTPERROR的报错。尝试安装多次,总是报同样的错误。检查发现可能原因如下:

  1. mysql正在使用。
  2. 镜像曾经被修改。
    在coda遇到'Could not connect to https://... 时,我们经常会考虑更换镜像地址。具体做法是在命令行窗口使用命令:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes 

此时,文件C:/users/用户名/.condarc内容也随之改变。
当多次安装pymysql 或 sqlalchemy无法成功时,考虑将文件C:/users/用户名/.condarc删除,再安装需要的包。亲测可行。

pymysql文档
python操作数据库示例:

#利用pymysql包 在'TESTDB'数据库下(先在mysql中建立该数据库。)新建表'EMPLOYEE '
#引入pymysql包
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost", "root", "testpassword", "TESTDB")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
cursor.execute(sql)
# 关闭数据库连接
db.close()

建立与数据库的连接的格式如下:

connection = pymysql.connect(host='localhost',#mysql服务器的ip,如果你安装在本地,那么就是localhost
                             user='user',#mysql用户名
                             password='passwd',#密码
                             db='db',#你要存储的数据库名
                             charset='utf8mb4',#数据编码
                             cursorclass=pymysql.cursors.DictCursor)

python和mysql(二)
将总结以下两点:

  1. pandas与mysql
  2. mysql时间日期的处理
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据库的名字叫WawaDB,是用python实现的。由此可见python是灰常强大啊! 简介 记录日志的需求一般是这样的: 只追加,不修改,写入按时间顺序写入; 大量写,少量读,查询一般查询一个时间段的数据; MongoDB的固定集合很好的满足了这个需求,但是MongoDB占内存比较大,有点儿火穿蚊子,小题大做的感觉。 WawaDB的思路是每写入1000条日志,在一个索引文件里记录下当前的时间和日志文件的偏移量。 然后按时间询日志时,先把索引加载到内存中,用二分法查出时间点的偏移量,再打开日志文件seek到指定位置,这样就能很快定位用户需要的数据并读取,而不需要遍历整个日志文件。 性能 Core 2 P8400,2.26GHZ,2G内存,32 bit win7 写入测试: 模拟1分钟写入10000条数据,共写入5个小时的数据, 插入300万条数据,每条数据54个字符,用时2分51秒 读取测试:读取指定时间段内包含某个子串的日志 数据范围 遍历数据量 结果数 用时(秒) 5小时 300万 604 6.6 2小时 120万 225 2.7 1小时 60万 96 1.3 30分钟 30万 44 0.6 索引 只对日志记录的时间做索引, 简介里大概说了下索引的实现,二分查找肯定没B Tree效率高,但一般情况下也差不了一个数量级,而且实现特别简单。 因为是稀疏索引,并不是每条日志都有索引记录它的偏移量,所以读取数据时要往前多读一些数据,防止漏读,等读到真正所需的数据时再真正给用户返回数据。 如下图,比如用户要读取25到43的日志,用二分法找25,找到的是30所在的点, 索 引:0 10 20 30 40 50 日志:|.........|.........|.........|.........|.........|>>>a = [0, 10, 20, 30, 40, 50]>>>bisect.bisect_left(a, 35)>>>3>>>a[3]>>>30>>>bisect.bisect_left(a, 43)>>>5>>>a[5]>>>50 所以我们要往前倒一些,从20(30的前一个刻度)开始读取日志,21,22,23,24读取后因为比25小,所以扔掉, 读到25,26,27,...后返回给用户 读取到40(50的前一个刻度)后就要判断当前数据是否大于43了,如果大于43(返回全开区间的数据),就要停止读了。 整体下来我们只操作了大文件的很少一部分就得到了用户想要的数据。 缓冲区 为了减少写入日志时大量的磁盘写,索引在append日志时,把buffer设置成了10k,系统默认应该是4k。 同理,为了提高读取日志的效率,读取的buffer也设置了10k,也需要根据你日志的大小做适当调整。 索引的读写设置成了行buffer,每满一行都要flush到磁盘上,防止读到不完整的索引行(其实实践证明,设置了行buffer,还是能读到半拉的行)。 查询 啥?要支持SQL,别闹了,100行代码怎么支持SQL呀。 现在查询是直接传入一个lambada表达式,系统遍历指定时间范围内的数据行时,满足用户的lambada条件才会返回给用户。 当然这样会多读取很多用户不需要的数据,而且每行都要进行lambda表达式的运算,不过没办法,简单就是美呀。 以前我是把一个需要查询的条件和日志时间,日志文件偏移量都记录在索引里,这样从索引里查找出符合条件的偏移量,然后每条数据都如日志文件里seek一次,read一次。这样好处只有一个,就是读取的数据量少了,但缺点有两个: 索引文件特别大,不方便加载到内存中 每次读取都要先seek,貌似缓冲区用不上,特别慢,比连续读一个段的数据,并用lambda过滤慢四五倍 写入 前面说过了,只append,不修改数据,而且每行日志最前面是时间戳。 多线程 查询数据,可以多线程同时查询,每次查询都会打开一个新的日志文件的描述符,所以并行的多个读取不会打架。 写入的话,虽然只是append操作,但不确认多线程对文件进行append操作是否安全,所以建议用一个队列,一个专用线程进行写入。 锁 没有任何锁。 排序 默认查询出来的数据是按时间正序排列,如需其它排序,可取到内存后用python的sorted函数排序,想怎么排就怎么排。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

半九拾

援助一个bug吧

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

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

打赏作者

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

抵扣说明:

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

余额充值