show-me-the-code: MySQL、Redis

第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。python

第 0003 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中。mysql

 

import

    在 coding 的过程当中,常常须要复用以前的代码,经过继承类的方法当然是好的,可是 OO 思想不是很强力,就须要调用以前的函数了;git

    解释了这么多,仍是功力尚浅、、、那么怎么调用以前编写过的函数呢?github

    假设须要在 A.py 中调用 B.py 文件内的 C(x, y) 函数:redis

  • 假设在同一路径下:
# -*- coding: utf-8 -*-
import B
B.C(x, y)

# 2 way
from B import C
C(x, y)
  • 假设在不一样目录下:
# -*- coding: utf-8 -*-
import sys
# 假设 B.py 在 /home/python 下
sys.path.append('/home/python')
import B
B.C(x, y)

# 2 way
import imp
B = imp.load_source('B', '/home/python/B.py')
improt B
B.C(x, y)

 

mysqlclient

    This is a fork of MySQLdb1sql

    This project adds Python 3 support and bug fixes. I hope this fork is merged back to MySQLdb1 like distribute was merged back to setuptools.数据库

    官方的一段解释已经说的很清楚了,因为 MySQLdb 未能彻底支持 Python 3(python 2.7~3.3),因此有识之士就从其中 fork 出来一个版本,针对 Python3 进行了支持,就是 mysqlclient:安全

Install

# Prerequisites

# You may need to install the Python and MySQL development headers and libraries like so:

sudo apt-get install python-dev libmysqlclient-dev # Debian / Ubuntu

sudo yum install python-devel mysql-devel # Red Hat / CentOS

# On Windows, there are binary wheel you can install without MySQLConnector/C or MSVC.

# Note on Python 3 : if you are using python3 then you need to install python3-dev using the following command :

sudo apt-get install python3-dev # debian / Ubuntu

sudo yum install python3-devel # Red Hat / CentOS

brew install mysql-connector-c # macOS (Homebrew)

# Install from PyPI

pip install mysqlclient

# NOTE: Wheels for Windows may be not released with source package. You should pin version in your requirements.txt to avoid trying to install newest source package.

    一开始使用 pip3 安装 mysqlclient 时,因为系统没有安装 python3-dev,致使在安装时报错,官方对其进行了说明:bash

Note on Python 3 : if you are using python3 then you need to install python3-dev using the following command :    见上app

简单使用

# -*- coding: utf-8 -*-
# 因为是 fork 的 MySQLdb,因此仍是 import MySQLdb
improt MySQLdb

# 建立一个 Mysql 链接对象
db = MySQLdb.connect(passwd="moonpie", db="thangs")

# 执行一个查询,首先须要一个游标,而后你能够执行查询
c = db.cursor()
max_pirce = 5
c.execute("""
SELECT spam, eggs, sausage FROM breakfast WHERE price < %s
""", (max_price, ))
# 或者能够执行一个 INSERT 语句
c.execute("""
INSERT INTO fast VALUES (%s)
""", (max_price, ))

# 获取结果
print(c.fetchone())
# commit SQL 语句
db.commit()

# 关闭游标,断开链接
c.close()
db.close()

表中自增主键归零

    在使用过程当中,因为清理了一些垃圾数据,致使了自增主键不连续,须要使主键归零有两种方法:

  • 暴力方法:truncate table
  • 暴力的 truncate table 固然不是很优雅的

    dbcc checkident(table_name, reseed, new_reseed_value) 当前值设置为 new_reseed_value,若是自建立表后没有将行插入该表,则在执行 DBCC CHECKIDENT 后插入第一行将使用 new_reseed_value 的值小于标识列中的最大值,之后引用该表时将产生 2627 号错误信息,这个方法不会清空已有数据,操做比较灵活,不只能够将自增值归零,也适用于删除大量连续行后,从新设置自增值并插入新的数据;或重新的值开始,固然不能和已有的冲突。

 

Pool

    数据库链接池:

    数据库链接池(Connection pooling)是程序启动时创建足够的数据库链接,并将这些链接组成一个链接池,由程序动态地对池中的链接进行申请,使用,释放。
我的理解:建立数据库链接是一个很耗时的操做,也容易对数据库形成安全隐患。因此,在程序初始化的时候,集中建立多个数据库链接,并把他们集中管理,供程序使用,能够保证较快的数据库读写速度,还更加安全可靠。

    看起来是很酷的一个方案,可是引用 Stack Overflow 上的一句话(谷歌翻译 0-0)

    I'd say don't bother with the connection pooling. They're often a source of trouble and with MySQL they're not going to bring you the performance advantage you're hoping for. This road may be a lot of effort to follow--politically--because there's so much best practices hand waving and textbook verbiage in this space about the advantages of connection pooling.

    我会说不要打扰链接池。 他们每每是一个麻烦的来源,并且MySQL也不会为您带来但愿的性能优点。 这条道路在政治上可能要付出很大的努力 - 由于在这个空间里有不少最好的作法,在这个空间里挥手和教科书,就是链接池的优势。

 

redis-py

安装

$ pip3 install redis

简单使用

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

import redis

# 链接 redis 获得一个 redis 链接对象
r = redis.StrictRedis(host='localhost', port=6379, password='mypasswd', db=0)
# 插入一条记录
r.set('foo', 'bar')
# 插入一条列表记录
r.lpush('code': list)
# 指定 key 获取 value
print(r.get('foo')

    相对而言,redis 用到的仍是简单一些,有待补充。

 

习题代码上传至 github

相关文章
相关标签/搜索