show-me-the-code: MySQL、Redis

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

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

 

import

    在 coding 的过程中,经常需要复用之前的代码,通过继承类的方法固然是好的,但是 OO 思想不是很强力,就需要调用之前的函数了;

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

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

  • 假设在同一路径下:
# -*- 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 MySQLdb1

    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,导致在安装时报错,官方对其进行了说明:

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

简单使用

# -*- 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

 

 

 

 

转载于:https://my.oschina.net/u/2470065/blog/866472

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值