第 0002 題:將 0001 題生成的 200 個激活碼(或者優惠券)保存到 MySQL 關係型數據庫中。python
第 0003 題:將 0001 題生成的 200 個激活碼(或者優惠券)保存到 Redis 非關係型數據庫中。mysql
在 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)
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:安全
# 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()
在使用過程當中,因爲清理了一些垃圾數據,致使了自增主鍵不連續,須要使主鍵歸零有兩種方法:
dbcc checkident(table_name, reseed, new_reseed_value) 當前值設置爲 new_reseed_value,若是自建立表後沒有將行插入該表,則在執行 DBCC CHECKIDENT 後插入第一行將使用 new_reseed_value 的值小於標識列中的最大值,之後引用該表時將產生 2627 號錯誤信息,這個方法不會清空已有數據,操做比較靈活,不只能夠將自增值歸零,也適用於刪除大量連續行後,從新設置自增值並插入新的數據;或重新的值開始,固然不能和已有的衝突。
數據庫鏈接池:
數據庫鏈接池(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也不會爲您帶來但願的性能優點。 這條道路在政治上可能要付出很大的努力 - 由於在這個空間裏有不少最好的作法,在這個空間裏揮手和教科書,就是鏈接池的優勢。
$ 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