python串連MySQL、MongoDB、Redis、memcache等資料庫的方法

來源:互聯網
上載者:User
用Python寫指令碼也有一段時間了,經常操作資料庫(MySQL),現在就整理下對各類資料庫的操作,如後面有新的參數會補進來,慢慢完善。

一,python 操作 MySQL:詳情見:
【apt-get install python-mysqldb】

複製代碼 代碼如下:


#!/bin/env python
# -*- encoding: utf-8 -*-
#-------------------------------------------------------------------------------
# Purpose: example for python_to_mysql
# Author: zhoujy
# Created: 2013-06-14
# update: 2013-06-14
#-------------------------------------------------------------------------------
import MySQLdb
import os

#建立和資料庫系統的串連,格式
#conn = MySQLdb.connect(host='localhost',user='root',passwd='123456',db='test',port=3306,charset='utf8')

#指定設定檔,確定目錄,或則寫絕對路徑
cwd = os.path.realpath(os.path.dirname(__file__))
db_conf = os.path.join(cwd, 'db.conf')
conn = MySQLdb.connect(read_default_file=db_conf,host='localhost',db='test',port=3306,charset='utf8')

#要執行的sql語句
query = 'select id from t1'

#擷取操作遊標
cursor = conn.cursor()

#執行SQL
cursor.execute(query)

#擷取一條記錄,每條記錄做為一個元組返回,返回3,遊標指到第2條記錄。
result1 = cursor.fetchone()
for i in result1:
print i
#返回影響的行數
print cursor.rowcount

#擷取指定數量記錄,每條記錄做為一個元組返回,返回1,2,遊標從第2條記錄開始,遊標指到第4條記錄。
result2 = cursor.fetchmany(2)
for i in result2:
for ii in i:
print ii


#擷取所有記錄,每條記錄做為一個元組返回,返回3,4,7,6,遊標從第4條記錄開始到最後。
result3 = cursor.fetchall()
for i in result3:
for ii in i:
print ii

#擷取所有記錄,每條記錄做為一個元組返回,返回3,4,7,6,遊標從第1條記錄開始
#重設遊標位置,0為位移量,mode=absolute | relative,預設為relative
cursor.scroll(0,mode='absolute')
result3 = cursor.fetchall()
for i in result3:
for ii in i:
print ii

#以下2種方法都可以把資料插入資料庫:
#(one)
for i in range (10,20):
query2 = 'insert into t1 values("%d",now())' %i
cursor.execute(query2)
#提交
conn.rollback()
#(two)
rows = []
for i in range (10,20):
rows.append(i)
query2 = 'insert into t1 values("%s",now())'
#executemany 2個參數,第2個參數是變數。
cursor.executemany(query2,rows)
#提交
conn.commit()

#選擇資料庫
query3 = 'select id from dba_hospital'
#重新選擇資料庫
conn.select_db('chushihua')

cursor.execute(query3)

result4 = cursor.fetchall()
for i in result4:
for ii in i:
print ii
#不定義query,直接執行:
cursor.execute("set session binlog_format='mixed'")

#關閉遊標,釋放資源
cursor.close()

'''
+------+---------------------+
| id | modifyT |
+------+---------------------+
| 3 | 2010-01-01 00:00:00 |
| 1 | 2010-01-01 00:00:00 |
| 2 | 2010-01-01 00:00:00 |
| 3 | 2010-01-01 00:00:00 |
| 4 | 2013-06-04 17:04:54 |
| 7 | 2013-06-04 17:05:36 |
| 6 | 2013-06-04 17:05:17 |
+------+---------------------+

'''

注意:在指令碼中,密碼寫在指令碼裡面很容易暴露,這樣可以用一個設定檔的方式來存密碼,如db.conf:

複製代碼 代碼如下:


[client]
user=root
password=123456

二,python 操作 MongoDB:

複製代碼 代碼如下:


#!/bin/env python
# -*- encoding: utf-8 -*-
#-------------------------------------------------------------------------------
# Purpose: example for python_to_mongodb
# Author: zhoujy
# Created: 2013-06-14
# update: 2013-06-14
#-------------------------------------------------------------------------------
import pymongo
import os

#建立和資料庫系統的串連,建立Connection時,指定host及port參數
conn = pymongo.Connection(host='127.0.0.1',port=27017)

#admin 資料庫有帳號,串連-認證-切換庫
db_auth = conn.admin
db_auth.authenticate('sa','sa')
#串連資料庫
db = conn.abc

#串連表
collection = db.stu

#查看全部表名稱
db.collection_names()
#print db.collection_names()

#訪問表的資料,指定列
item = collection.find({},{"sname":1,"course":1,"_id":0})
for rows in item:
print rows.values()

#訪問表的一行資料
print collection.find_one()

#得到所有的列
for rows in collection.find_one():
print rows

#插入
collection.insert({"sno":100,"sname":"jl","course":{"D":80,"S":85}})
#或
u = dict(sno=102,sname='zjjj',course={"D":80,"S":85})
collection.insert(u)

#得到行數
print collection.find().count()
print collection.find({"sno":100})

#排序,按照某一列的值。pymongo.DESCENDING:倒序;pymongo.ASCENDING:升序。按照sno倒序
item = collection.find().sort('sno',pymongo.DESCENDING)
for rows in item:
print rows.values()

#多列排序
item = collection.find().sort([('sno',pymongo.DESCENDING),('A',pymongo.ASCENDING)])

#更新,第一個參數是條件,第二個參數是更新操作,$set,%inc,$push,$ne,$addToSet,$rename 等
collection.update({"sno":100},{"$set":{"sno":101}})
#更新多行和多列
collection.update({"sno":102},{"$set":{"sno":105,"sname":"SSSS"}},multi=True)

#刪除,第一個參數是條件,第二個參數是刪除操作。
collection.remove({"sno":101})

'''
sno:學號;sname:姓名;course:科目

db.stu.insert({"sno":1,"sname":"張三","course":{"A":95,"B":90,"C":65,"D":74,"E":100}})
db.stu.insert({"sno":2,"sname":"李四","course":{"A":90,"B":85,"X":75,"Y":64,"Z":95}})
db.stu.insert({"sno":3,"sname":"趙五","course":{"A":70,"B":56,"F":85,"G":84,"H":80}})
db.stu.insert({"sno":4,"sname":"zhoujy","course":{"A":64,"B":60,"C":95,"T":94,"Y":85}})
db.stu.insert({"sno":5,"sname":"abc","course":{"A":87,"B":70,"Z":56,"G":54,"H":75}})
db.stu.insert({"sno":6,"sname":"楊六","course":{"A":65,"U":80,"C":78,"R":75,"N":90}})
db.stu.insert({"sno":7,"sname":"陳二","course":{"A":95,"M":68,"N":84,"S":79,"K":89}})
db.stu.insert({"sno":8,"sname":"zhoujj","course":{"P":90,"B":77,"J":85,"K":68,"L":80}})
db.stu.insert({"sno":9,"sname":"ccc","course":{"Q":85,"B":86,"C":90,"V":87,"U":85}})

'''

計算Mongodb文檔中各集合的數目:

複製代碼 代碼如下:


import pymongo

conn = pymongo.Connection(host='127.0.0.1',port=27017)
db = conn.abc #abc文檔
for tb_name in db.collection_names(): #迴圈出各集合名
Count = db[tb_name].count() #計算各集合的數量
if Count > 2: #過濾條件
print tb_name + ':' + str(Count)

'''
conn = pymongo.Connection(host='127.0.0.1',port=27017)
db = conn.abc
for tb_name in db.collection_names():
print tb_name + ':'
exec('print ' + 'db.'+tb_name+'.count()') #變數當集合的處理方式

OR

conn = pymongo.Connection(host='127.0.0.1',port=27017)
db = conn.abc
for tb_name in db.collection_names():
mon_dic=db.command("collStats", tb_name) #以字典形式返回
print mon_dic.get('ns'),mon_dic.get('count')

'''

三,python 操作 Redis:

複製代碼 代碼如下:


#!/bin/env python
# -*- encoding: utf-8 -*-
#-------------------------------------------------------------------------------
# Purpose: example for python_to_mongodb
# Author: zhoujy
# Created: 2013-06-14
# update: 2013-06-14
#-------------------------------------------------------------------------------

import redis

f = open('aa.txt')
while True:
line = f.readline().strip().split(' # ')
if line == ['']:
break
UserName,Pwd,Email = line
# print name.strip(),pwd.strip(),email.strip()
rc = redis.StrictRedis(host='127.0.0.1',port=6379,db=15)
rc.hset('Name:' + UserName,'Email',Email)
rc.hset('Name:' + UserName,'Password',Pwd)
f.close()

alluser = rc.keys('*')
#print alluser
print "===================================讀出存進去的資料==================================="
for user in alluser:
print ' # '.join((user.split(':')[1],rc.hget(user,'Password'),rc.hget(user,'Email')))

四,python 操作 memcache:

複製代碼 代碼如下:


import memcache
mc = memcache.Client(['127.0.0.1:11211'],debug=1)

複製代碼 代碼如下:


#!/usr/bin/env python
#coding=utf-8
import MySQLdb
import memcache
import sys
import time

def get_data(mysql_conn):
# nn = raw_input("press string name:")
mc = memcache.Client(['127.0.0.1:11211'],debug=1)
t1 =time.time()
value = mc.get('zhoujinyia')
if value == None:
t1 = time.time()
print t1
query = "select company,email,sex,address from uc_user_offline where realName = 'zhoujinyia'"
cursor= mysql_conn.cursor()
cursor.execute(query)
item = cursor.fetchone()
t2 = time.time()
print t2
t = round(t2-t1)
print "from mysql cost %s sec" %t
print item
mc.set('zhoujinyia',item,60)
else :
t2 = time.time()
t=round(t2-t1)
print "from memcache cost %s sec" %t
print value
if __name__ =='__main__':
mysql_conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='member',port=3306,charset='utf8')
get_data(mysql_conn)

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.