在没有DB-API之前,接口程序混乱。具体的就是说,由于最底层用的数据库技术不同,所以在应用程序层就要针对特定的数据库进行特定的编码,如果要改变一个版本所使用的底层数据库,那么之前编写的应用程序中关于数据库的代码也要进行相应的改变。
python DB-API:python访问数据库的统一接口规范。
这里有一个约定:程序员使用python与任何底层数据库交互时都使用DB-API,而不论这个数据库技术具体是什么,这么做是因为,利用驱动程序,程序员无需了解与数据库具体API交互的底层细节,因为DB-API在代码与驱动程序之间提供了一个抽象层,这里的想法是:通过使用DB-API编程,可以根据需要替换掉底层数据库技术,而无须丢弃现有的代码。
下面分步骤详解:
dbconfig = {
"host": "127.0.0.1",
"user": "vsearch",
"password": "vseacrh",
"database": vsearchlogDB
}
导入数据库驱动程序
import mysql.connector
建立与MySQL服务器的一个连接
conn = mysql.connector.connect(**dbconfig)
(**)记法告诉connect函数用一个变量提供了参数字典,如果看到这种记法,connect函数会把这个字典展开为4个单独的参数,然后在connect函数中使用这些参数来建立连接。
_SQL = """show tables"""
cursor.execute(_SQL);
一般用三重双引号来编写要发送给数据库服务器的SQL,之所以使用三重双引号,是因为三重双引号可以暂定不启用python解释器中的“行末即语句结束的规则”。
执行cursor.execute()命令时,这个SQL查询会被发送到MySQL的服务器,它会执行这个查询(假设正确),不过结果并不会立即显示,必须要请求结果。
这里要特别注意点是:fetchall()方法,它返回的是客户端缓冲区现在还没有被影响的记录。并且返回的数据类型是一个元组列表。
当使用insert操作时,由于写数据库是一个开销很大的操作,所以数据库系统会缓存insert,然后再一次性应用全部的insert。这带来的问题就是,刚刚插入的数据可能访问不到。但是可以通过事务提交(conn.commit())来强制插入数据到数据库,这样既可解决访问不到的问题。
cursor.close()
conn.close()
下面是最近做的一个项目中关于数据库连接的源码:
dbconfig = {"host": "127.0.0.1",
"user": "vsearch",
"password": "vsearch",
"database": "vsearchlogDB",
}
import mysql.connector
conn = mysql.connector.connect(**dbconfig)
cursor = conn.cursor()
_SQL = """insert into log
(phrase, letters, ip, browser_string, results)
values
(%s, %s, %s, %s, %s)"""
cursor.execute(_SQL, ("afeng", "jingjing", "127.0.0.1", "opera", "{'x', 'y'}"))
conn.commit()
_SQL = """select * from log"""
cursor.execute(_SQL)
for row in cursor.fetchall():
print(row)
cursor.close()
conn.close()
https://www.imooc.com/learn/475