原文地址:https://www.cnblogs.com/R-bear/p/7022231.html
python DB-API介绍
1.python标准数据库接口为 python DB-API,python DB-API为开发人员提供了数据库应用标称接口
2.python数据库接口支持非常多的数据库,可以选择适合你项目的数据库:
MySQL
PostgreSQL
Microsoft SQL Server 2000
Oracle
Sybase
具体查看:https://wiki.python.org/moin/DatabaseInterfaces
不同的数据库,就需要下载不同的DB API模块,例如访问Oracle数据库和MySQL数据库,需要下载Oracle和MySQL数据库模块
DB-API是一个规范,它定义一个系列必须的对象和数据库存取方式,以便各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口.
python的DB-API,为大多数数据库实现了接口,使用它连接各种数据库后,就可以使用相同的方式操作各种数据库
通用步骤:
1.引入模块
2.获取与数据库的连接
3.执行SQL语句和存储过程
4.关闭数据库连接
什么是MySQLdb?
MySQLdb是用于python连接Mysql数据库的接口,它实现了python数据库API规范V2.0,基于MySQL C API上简历的
1.安装好mysql
2.导入python与mysql DB API模块
import mysql.connector #先安装mysql-connector-python-1.0.12-py3.3,再引入包 #创建链接数据库
config={'host':'127.0.0.1',#默认127.0.0.1
'user':'root',
'password':'vertrigo',
'port':3306,#默认即为3306
'database':'test',
'charset':'utf8'#默认即为utf8
}
try:
cnn=mysql.connector.connect(**config)#connect方法加载config的配置进行数据库的连接,完成后用一个变量进行接收
except mysql.connector.Error as e:
print('数据库链接失败!',str(e))
else:#try没有异常的时候才会执行
print("sucessfully!")
结果:
sucessfully!
接着上面,建表
#建表
sql_create_table='CREATE TABLE`student`\
(`id`int(10)NOT NULL AUTO_INCREMENT,\
`name`varchar(10) DEFAULT NULL,\
`age`int(3) DEFAULT NULL,\
PRIMARY KEY(`id`))\
ENGINE=MyISAM DEFAULT CHARSET = utf8' #获取执行的权限,利用数据库连接的返回,调用cursor方法获取一个标记位,再去操作数据库
#再通过标记位,去操作数据库
cursor = cnn.cursor(buffered = True)#buffered=True会把结果集保存到本地并一次性返回,这样可以提高性能
try:
cursor.execute(sql_create_table)#执行sql语句
except mysql.connector.Error as e:
print('创建表失败!',str(e))
接着上面,添加数据
#插入数据库
cursor = cnn.cursor(buffered=True)#获取插入的标记位
try:
#第一种:直接字符串插入方式
#表中的id是自增长,所以不用传id
#sql_insert1="insert into student(name,age) values ('orange',20)"
#cursor.execute(sql_insert1) #第二种:元组连接插入方式
sql_insert2="insert into student(name,age) values (%s,%s)"
#此处的%s为占位符,而不是格式化字符串,所以age用%s
data = ('xiongrun',18)#元组的形式传入两个值
cursor.execute(sql_insert2,data)#执行插入 #数据库的存储一类引擎为Innodb,执行完成后需执行commit进行事务提交
#cnn.commit()
#cursor.execute('commit') #当前的练习用的存储引擎为MyISAM,不用执行commit
#执行execute时就已经执行事务提交 #第三种:可以一次插入多条,效率比一条条插高,用的方法是executemany
stmt = 'insert into student(name,age) values (%s,%s)'
data = [
('xiongrun1',21),
('xiongrun2',22),
('xiongrun3',21)]
cursor.executemany(stmt,data) except mysql.connector.Error as e:
print('插入数据报错!',str(e))
finally:#无论如何都会执行下面的语句
cursor.close()#关闭标记位
cnn.close()#关闭数据库链接
接上面,查询数据
#查询
cursor = cnn.cursor(buffered = True)#获取查询的标记位
try:
#第一种
sql_query1='select id,name from student where age > %s'
cursor.execute(sql_query1,(1,))#固定格式,记住
values = cursor.fetchall()#符合条件的所有数据,全部赋值给values
print('所有数据:',values) #第二种
sql_query2 = 'select * from student'
cursor.execute(sql_query2)
#加[0]代表返回第一个字段,如果想返回一条完整的数据就不要加
result1 = cursor.fetchone()
print("一条数据:",result1)
result2 = cursor.fetchone()[0]
print("第一个字段:",result2) result3 = cursor.fetchmany(2)#返回2行数据
print("前2条数据:",result3) except mysql.connector.Error as e:
print('查询数据报错!',str(e))
finally:
cursor.close()#关闭标记位
cnn.close()#关闭数据库链接
接上面,删除
cursor = cnn.cursor()
try:
sql_delete='delete from student where name = %s and age < %s'
data = ('xiongrun',22)
cursor.execute(sql_delete,data)
except mysql.connector.Error as e:
print('删除错误',str(e))
finally:
cursor.close()#关闭标记位
cnn.close()#关闭数据库链接
结果:
练习:
手工创建一个表(表引擎为myisam),然后利用python对这表进行先插入再查询的操作
create table student_myisam (id int(10) not null auto_increment,name varchar(10) default
null,age int(3) default null,primary key (id))engine = myisam default charset = utf8;
手动创建表student_myisam
import mysql.connector #先安装mysql-connector-python-1.0.12-py3.3,再引入包 #创建链接数据库
config={'host':'127.0.0.1',#默认127.0.0.1
'user':'root',
'password':'vertrigo',
'port':3306,#默认即为3306
'database':'test',
'charset':'utf8'#默认即为utf8
}
try:
cnn=mysql.connector.connect(**config)#connect方法加载config的配置进行数据库的连接,完成后用一个变量进行接收
except mysql.connector.Error as e:
print('数据库链接失败!',str(e))
else:#try没有异常的时候才会执行
print("sucessfully!") #插入数据库
cursor = cnn.cursor(buffered=True)#获取插入的标记位 try:
sql_insert1="insert into student_myisam(name,age) values (%s,%s)"
#此处的%s为占位符,而不是格式化字符串,所以age用%s
data = ('xiongrun',18)#元组的形式传入两个值
cursor.execute(sql_insert1,data)#执行插入
except mysql.connector.Error as e:
print('插入数据报错!',str(e)) #查询数据
try:
sql_query2='select id,name from student_myisam where age > %s'
cursor.execute(sql_query2,(1,))#固定格式,记住
values = cursor.fetchall()#符合条件的所有数据,全部赋值给values
print('所有数据:',values)
except mysql.connector.Error as e:
print('查询数据报错!',str(e))
finally:
cursor.close()#关闭标记位
cnn.close()#关闭数据库链接
结果:
sucessfully!
所有数据: [(1, 'xiongrun')]
手工创建一个表(表引擎为innodb),然后利用python对这个表进行先插入再查询的操作
create table student_innodb (id int(10) not null auto_increment,name varchar(10) default
null,age int(3) default null,primary key (id))engine = innodb default charset = utf8;
手工创建student_innodb成功
import mysql.connector #先安装mysql-connector-python-1.0.12-py3.3,再引入包 #创建链接数据库
config={'host':'127.0.0.1',#默认127.0.0.1
'user':'root',
'password':'vertrigo',
'port':3306,#默认即为3306
'database':'test',
'charset':'utf8'#默认即为utf8
}
try:
cnn=mysql.connector.connect(**config)#connect方法加载config的配置进行数据库的连接,完成后用一个变量进行接收
except mysql.connector.Error as e:
print('数据库链接失败!',str(e))
else:#try没有异常的时候才会执行
print("sucessfully!") cursor = cnn.cursor(buffered=True)#获取插入的标记位 #插入数据库
try:
sql_insert1="insert into student_innodb(name,age) values (%s,%s)"
#此处的%s为占位符,而不是格式化字符串,所以age用%s
data = ('xiongrun1',20)#元组的形式传入两个值
cursor.execute(sql_insert1,data)#执行插入
#表引擎是innodb,需要执行下面两句,进行事务提交,否则会报错
cnn.commit()
cursor.execute('commit')
except mysql.connector.Error as e:
print('插入数据报错!',str(e)) #查询数据
try:
sql_query2='select id,name from student_innodb where age > %s'
cursor.execute(sql_query2,(1,))#固定格式,记住
values = cursor.fetchall()#符合条件的所有数据,全部赋值给values
print('所有数据:',values)
except mysql.connector.Error as e:
print('查询数据报错!',str(e))
finally:
cursor.close()#关闭标记位
cnn.close()#关闭数据库链接
结果:
sucessfully!
所有数据: [(1, 'xiongrun1')]