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

相關文章
相關標籤/搜索