python数据库操作框架_python bottle 框架操作数据库
python操作mysql數(shù)據(jù)庫(kù)用MySQLdb模板,操作postgresql則用psycopg2模塊
安裝MySQLdb(用yum安裝,好像只能與mysql5.1版本配合使用):yum install -y MySQL-python
安裝完后,可用import MySQLdb來使用
下面先簡(jiǎn)介MySQLdb的各種方法
MySQLdb.connect():連接數(shù)據(jù)庫(kù),主要有以下參數(shù):
host:數(shù)據(jù)庫(kù)主機(jī)名.默認(rèn)是用本地主機(jī).
user:數(shù)據(jù)庫(kù)登陸名.默認(rèn)是當(dāng)前用戶.
passwd:數(shù)據(jù)庫(kù)登陸的秘密.默認(rèn)為空.
db:要使用的數(shù)據(jù)庫(kù)名.沒有默認(rèn)值.
port:MySQL服務(wù)使用的TCP端口.默認(rèn)是3306.
charset:數(shù)據(jù)庫(kù)編碼。
unix_socket:指定mysql的socket路徑,如:unix_socket='/var/mysql/mysql.sock'
創(chuàng)建連接:conn = MySQLdb.connect(user='root',passwd='111111',host='localhost',port=3306, unix_socket='/var/mysql/mysql.sock',charset='utf8')
釋放連接:
釋放連接時(shí)可以應(yīng)用Connection類型對(duì)象的close方法。一般操作完數(shù)據(jù)庫(kù)后,需要關(guān)閉連接conn.close()
Cursor(游標(biāo))對(duì)象:
執(zhí)行SQL語(yǔ)句前要獲得一個(gè)指定連接的Cursor對(duì)象,由Cursor對(duì)象執(zhí)行SQL查詢并獲取結(jié)果。
獲得Cursor對(duì)象的方法cur = conn.cursor()
關(guān)閉Cursor:
執(zhí)行SQL結(jié)束后正常要關(guān)閉cursor對(duì)象cur.close()
查詢,插入,更新、刪除操作:
Cursor類型提供了execute方法用于執(zhí)行SQL操作execute(query [,parameters])
query是一個(gè)SQL字符串,parameters是一個(gè)序列或映射,返回值是所影響的記錄數(shù)
查詢
cur.execute("select user,host from mysql.user)
cur.execute("select * from user where name = %s and age = %s", {'name':'drfdai', 'age'30})
這里和字符串的格式化操作類似,但不管參數(shù)是什么類型,都要用'%s'
獲取結(jié)果
獲取結(jié)果集有三種方法,fetchone、fetchall和fetchmany,返回結(jié)果是一個(gè)tuple對(duì)象,tuple中的每一個(gè)元素對(duì)應(yīng)查詢結(jié)果中的一條記錄。
fetchone()返回結(jié)果集中的一條記錄
fetchall()返回結(jié)果集中的所有記錄
fetchmany([N])返回結(jié)果集中N條記錄
插入、更新、刪除
cur.execute("insert user (name, age) values(%s, %s)", ('drfdai', 20))
更新和刪除的操作與更新、刪除類似
除了execute,Cursor類還提供了executemany()方法
executemany(query [, parametersequence])
querey是一個(gè)查詢字符串,parametersequence是一個(gè)參數(shù)序列。這一序列的每一項(xiàng)都是一個(gè)序列或映射象。但executemany只適合插入、更新或刪除操作,而不適用于查詢操作。
cur.execute("insert user(name, age) values(%s, %s)", (('drf', 31), ('jiang', 21)))
提交
mysql現(xiàn)在一般會(huì)默認(rèn)InnoDB作為默認(rèn)引擎,InnoDB引擎執(zhí)行插入、更新、刪除操作后要進(jìn)行提交,才會(huì)更新數(shù)據(jù)庫(kù),因此需要用commit()提交后,才會(huì)生效執(zhí)行的SQL
cur.commit()
回滾
如果在執(zhí)行事務(wù)SQL時(shí),需要回滾的話,就用以下rollback()
rollback()
對(duì)以上操作,進(jìn)行一個(gè)簡(jiǎn)單的函數(shù)封裝,這樣用起來更方便,特別是需要經(jīng)常讀寫數(shù)據(jù)庫(kù)的時(shí)候,省事,以下是我封裝好的簡(jiǎn)單函數(shù):#!/usr/bin/env python
#coding=utf-8
import MySQLdb
import logging
#定義錯(cuò)誤日志路徑
error_log = '/'.join((pro_path,'log/task_error.log'))
#定義日志輸出格式
logging.basicConfig(level=logging.ERROR,
format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt = '%Y-%m-%d %H:%M:%S',
filename = error_log,
filemode = 'a')
#定義數(shù)據(jù)庫(kù)參數(shù)
db_name = 'task'
db_user = 'root'
db_pass = '111111'
db_ip = 'localhost'
db_port = 3306
def writeDb(sql,db_data=()):
"""
連接mysql數(shù)據(jù)庫(kù)(寫),并進(jìn)行寫的操作
"""
try:
conn = MySQLdb.connect(db=db_name,user=db_user,passwd=db_pass,host=db_ip,port=int(db_port))
cursor = conn.cursor()
except Exception,e:
print e
logging.error('數(shù)據(jù)庫(kù)連接失敗:%s' % e)
return False
try:
cursor.execute(sql,db_data)
conn.commit()
except Exception,e:
conn.rollback()
logging.error('數(shù)據(jù)寫入失敗:%s' % e)
return False
finally:
cursor.close()
conn.close()
return True
def readDb(sql,db_data=()):
"""
連接mysql數(shù)據(jù)庫(kù)(從),并進(jìn)行數(shù)據(jù)查詢
"""
try:
conn = MySQLdb.connect(db=db_name,user=db_user,passwd=db_pass,host=db_ip,port=int(db_port))
cursor = conn.cursor()
except Exception,e:
print e
logging.error('數(shù)據(jù)庫(kù)連接失敗:%s' % e)
return False
try:
cursor.execute(sql,db_data)
data = [dict((cursor.description[i][0], value) for i, value in enumerate(row)) for row in cursor.fetchall()]
except Exception,e:
logging.error('數(shù)據(jù)執(zhí)行失敗:%s' % e)
return False
finally:
cursor.close()
conn.close()
return data
如果數(shù)據(jù)庫(kù)連接失敗,把錯(cuò)誤寫入日志,并返回Flase。
writeDb是用來寫入數(shù)據(jù)的,如果寫入失敗,寫會(huì)把錯(cuò)誤寫入服務(wù)器日志中,然后返回False,如果成功,返回True。
readDb是用來讀取數(shù)據(jù)的,如果讀取失敗,寫會(huì)把錯(cuò)誤寫入服務(wù)器日志中,然后返回False,如果成功,則返回查詢到的數(shù)據(jù),數(shù)據(jù)類型是經(jīng)過處理好的字典格式。
以下是writeDb和readDb使用的方法:@route('/api/getuser',method="POST")
def getuser():
sql = "select * from user;"
userlist = readDb(sql,)
return json.dumps(userlist)
@route('/adduser',method="POST")
def adduser():
name = request.forms.get("name")
age = request.forms.get("age")
sex = request.forms.get("sex")
qq = request.forms.get("qq")
email = request.forms.get("email")
departmentid = request.forms.get("department")
if not name or not age or not sex or not qq or not email or not departmentid:
return '-2'
sql = """
INSERT INTO
user(name,age,sex,qq,email,departmentid)
VALUES(%s,%s,%s,%s,%s,%s)
"""
data = (name,age,sex,qq,email,departmentid)
result = writeDb(sql,data)
if result:
return '0'
else:
return '-1'
總結(jié)
以上是生活随笔為你收集整理的python数据库操作框架_python bottle 框架操作数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pfile文件怎么恢复格式_回收站清空的
- 下一篇: 阿里云上Kubernetes集群联邦