数据库API定义了一组用于连接数据库服务器,执行SQL查询并获得结果的高级函数和对象。其中两个主要的对象:一个是用于管理数据库连接的Connection对象,另一个是用于执行查询的Cursor对象
模块函数connect的使用:
c = MySQLdb.connect(
host="数据库ip",
db="数据库名称",
port=3306, #默认是3306端口
user="登陆数据库用户名",
password="登陆数据库密码",
charset="utf8" #指定字符集
)
连接成功则返回Connection对象,Connection对象的实例化方法有:
c.close() | 关闭与数据库服务器的连接 |
---|---|
c.commit() | 将所有未完成的事务提交到数据库中,如果需要进行增删改,都需要调用此方法 |
c.rollback() | 将数据库回滚到未完成事务的开始状态,如果在更新数据库的过程中代码发生异常,可以用此方法撤销对数据库做出的修改 |
c.cursor() | 创建一个使用连接的新的cursor对象,可以使用它来执行SQL语句并获得结果 |
调用c.cursor()方法可以创建Cursor对象,例cur = c.cursor(),cur的实例有:
cur.close() | 关闭游标,防止再对其使用 |
---|---|
cur.execute(query [,parameters]) | 在数据库上执行查询,query是一条sql执行语句的字符串parameters是一个序列或映射,用于查询字符串中的变量赋值 |
cur.executemary(query [,parametersequence]) | 重复执行或查询sql命令 |
cur.fetchone() | 返回由execute()和executemary()生成的下一行结果集,生成的结果一般是元组或列表 |
cur.fetchmary([size]) | size为查询要显示的数量 |
cur.fetchall() | 返回全部的行数 |
cur.description | 提供当前的每一行信息的元组序列 |
cur.rowrount | 由cur.execute()结果后生成的结果行数,如果设置为-1,则表示没有结果 |
数据库连接以及查询数据练习
import MySQLdb
class MysqlSearch(object):
def __init__(self):
self.get_conn()
def get_conn(self):
try:
self.conn = MySQLdb.connect(
host='127.0.0.1',
port=3306,
db='sql_718',
user='root',
password='123456',
charset='utf8'
)
except MySQLdb.Error as e:
print("Error:" %e)
def close_conn(self):
try:
if self.get_conn():
self.conn.close()
except MySQLdb.Error as e:
print('ERROR:%s' % e)
def get_one(self): #处理单行数据
sql = 'SELECT * FROM `news`' #准备sql语句
cursor = self.conn.cursor() #找到cursor游标
cursor.execute(sql) #执行sql语句
# 拿到查询的结果,fetchone()只能拿到一条数据,如果要查询多条数据,可以用使用fetchmany()
rest = cursor.fetchone() #处理单行数据
#print(rest)
#处理数据
# k_list = [k[0] for k in cursor.description]
# print(k_list)
# zip_obj = zip(k_list, rest)
# print(zip_obj)
# rest_dict = dict(zip_obj)
# print(rest_dict)
rest_dict = dict(zip([k[0] for k in cursor.description], rest)) #返回字典形式,以便在mian()函数中使用键值对的方式查询值
cursor.close()
self.conn.close()
return rest_dict
def get_more(self): #处理多行数据
sql = 'SELECT * FROM `news`' #准备sql语句
cursor = self.conn.cursor() #找到cursor游标
cursor.execute(sql) #执行sql语句
rest2 = cursor.fetchall()
rest_dict_more = [dict(zip([k[0] for k in cursor.description], row)) for row in rest2]
cursor.close()
self.conn.close()
return rest_dict_more
#添加数据
def add_data(self):
try:
sql = 'INSERT INTO `news` (`title`,`content`, `types`, `image`, `author`, `is_valid`) VALUE (%s, %s, %s, %s, %s, %s);'
cursor = self.conn.cursor()
cursor.execute(sql,('王者法师是怎样炼成的', '前期帮打野看蓝看野猪,配合打野入侵野区...', '企鹅号', '/static/img/news/01.png', '小白银', 1))
self.conn.commit()
cursor.close()
except MySQLdb.Error as e:
print("Error:" %e)
self.conn.rollback()
self.conn.close()
#修改数据
def update_data(self, word):
try:
sql = 'UPDATE `news` SET title = "%s" WHERE id = 1;' %word
cursor = self.conn.cursor()
cursor.execute(sql)
self.conn.commit()
cursor.close()
except MySQLdb.Error as e:
print("Error:" %e)
self.conn.rollback() #如果失败则回滚
self.conn.close()
def main():
obj = MysqlSearch()
rest = obj.get_one()
print("查询一条数据")
print(rest['title'])
print("分割线----------------------------")
def main_more():
obj = MysqlSearch()
rest2 = obj.get_more()
print("查询多条数据")
for item in rest2:
print(item['title'])
def main_add():
obj = MysqlSearch()
obj.add_data()
def main_update():
obj = MysqlSearch()
obj.update_data("掌握王者开团时机")
if __name__ == '__main__':
main()
main_more()
main_add()
main_update()
运行结果为:
原先数据库的表内容:
MySQLdb定义了一个高级异常Error,作为其它错误的基类,具体的错误处理:
异常 | 描述 |
---|---|
DatabaseError | 与数据库本身相关的错误 |
InterfaceError | 与数据库接口相关的错误,但不是数据库本身 |
DataError | 与处理的数据相关的错误,例如,类型转换错误,除零等等 |
OperationalError | 与数据库本身的运行相关的错误,例如丢失连接 |
IntegrityError | 当数据库的关系完整性被破坏时出现的错误 |
InternalError | 数据库内部的错误,例如丢失一个失效的游标 |
ProgrammingError | SQL查询中错误 |
NotSupportedError | 不受底层数据库支持的数据库API方法导致的错误 |