Python数据库API(DB API)

Python数据库API(DB API),第1张

虽然 Python 需要为 *** 作不同的数据库使用不同的模块,但不同的数据库模块并非没有规律可循,因为它们基本都遵守 Python 制订的 DB API 协议,目前该协议的最新版本是 2.0,因此这些数据库模块有很多 *** 作其实都是相同的。下面先介绍不同数据库模块之间的通用内容。

全局变量

Python 推荐支持 DB API 2.0 的数据库模块都应该提供如下 3 个全局变量:

apilevel:该全局变量显示数据库模块的 API 版本号。对于支持 DB API 2.0 版本的数据库模块来说,该变量值通常就是 2.0。如果这个变量不存在,则可能该数据库模块暂时不支持 DB API 2.0。读者应该考虑选择使用支持该数据库的其他数据库模块。

threadsafety:该全局变量指定数据库模块的线程安全等级,该等级值为 0~3 ,其中 3 代表该模块完全是线程安全的;1 表示该模块具有部分线程安全性,线程可以共享该模块,但不能共享连接;0 则表示线程完全不能共享该模块。

paramstyle:该全局变量指定当 SQL 语句需要参数时,可以使用哪种风格的参数。该变量可能返回如下变量值:

format:表示在 SQL 语句中使用 Python 标准的格式化字符串代表参数。例如,在程序中需要参数的地方使用 %s,接下来程序即可为这些参数指定参数值。

pyformat:表示在 SQL 语句中使用扩展的格式代码代表参数。比如使用 %(name),这样即可使用包含 key 为 name 的字典为该参数指定参数值。

qmark:表示在 SQL 语句中使用问号(?)代表参数。在 SQL 语句中有几个参数,全部用问号代替。

numeric:表示在 SQL 语句中使用数字占位符(:N)代表参数。例如:1 代表一个参数,:2 也表示一个参数,这些数字相当于参数名,因此它们不一定需要连续。

named:表示在 SQL 语句中使用命名占位符(:name)代表参数。例如 :name 代表一个参数,:age 也表示一个参数。

通过查阅这些全局变量,即可大致了解该数据库 API 模块的对外的编程风格,至于该模块内部的实现细节,完全由该模块实现者负责提供,通常不需要开发者关心。

数据库 API 的核心类

遵守 DB API 2.0 协议的数据库模块通常会提供一个 connect() 函数,该函数用于连接数据库,并返回数据库连接对象。

数据库连接对象通常会具有如下方法和属性:

cursor(factory=Cursor):打开游标

commit():提交事务。

rollback():回滚事务。

close():关闭数据库连接。

isolation_level:返回或设置数据库连接中事务的隔离级别。

in_transaction:判断当前是否处于事务中。

上面第一个方法可以返回一个游标对象,游标对象是 Python DB API 的核心对象,该对象主要用于执行各种 SQL 语句,包括 DDL、DML、select 查询语句等。使用游标执行不同的 SQL 语句返回不同的数据。

游标对象通常会具有如下方法和属性:

execute(sql[, parameters]):执行 SQL 语句。parameters 参数用于为 SQL 语句中的参数指定值。

executemany(sql, seq_of_parameters):重复执行 SQL 语句。可以通过 seq_of_parameters 序列为 SQL 语句中的参数指定值,该序列有多少个元素,SQL 语句被执行多少次。

executescript(sql_script):这不是 DB API 2.0 的标准方法。该方法可以直接执行包含多条 SQL 语句的 SQL 脚本。

fetchone():获取查询结果集的下一行。如果没有下一行,则返回 None。

fetchmany(size=cursor.arraysize):返回查询结果集的下 N 行组成的列表。如果没有更多的数据行,则返回空列表。

fetchall():返回查询结果集的全部行组成的列表。

close():关闭游标。

rowcount:该只读属性返回受 SQL 语句影响的行数。对于 executemany() 方法,该方法所修改的记录条数也可通过该属性获取。

lastrowid:该只读属性可获取最后修改行的 rowid。

arraysize:用于设置或获取 fetchmany() 默认获取的记录条数,该属性默认为 1。有些数据库模块没有该属性。

description:该只读属性可获取最后一次查询返回的所有列的信息。

connection:该只读属性返回创建游标的数据库连接对象。有些数据库模块没有该属性。

总结来看,Python 的 DB API 2.0 由一个 connect() 开始,一共涉及数据库连接和游标两个核心 API。它们的分工如下:

数据库连接:用于获取游标、控制事务。

游标:执行各种 SQL 语句。

掌握了上面这些 API 之后,接下来可以大致归纳出 Python DB API 2.0 的编程步骤。

*** 作数据库的基本流程

使用 Python DB API 2.0 *** 作数据库的基本流程如下:

调用 connect() 方法打开数据库连接,该方法返回数据库连接对象。

通过数据库连接对象打开游标。

使用游标执行 SQL 语句(包括 DDL、DML、select 查询语句等)。如果执行的是查询语句,则处理查询数据。

关闭游标。

关闭数据库连接。

下图显示了使用 Python DB API 2.0 *** 作数据库的基本流程。

通过MySQL自定义的API函数进行连接

1、使用API的方式连接,需要加载mysql的头文件和lib文件。

在VS2010的附加包含目录中添加\MySQL\MySQL Server 5.1\include。在安装MySql的目录下找。 把libmysql.dll和libmysql.lib文件拷贝到所建的工程目录下。然后在头文件里包含以下内容:

//mysql所需的头文件和库文件

#include "winsock.h"

#include "mysql.h"

#pragma comment(lib,"libmySQL.lib")

2、进行编码

(1)连接mysql数据库

头文件里定义数据源指针 MYSQL m_sqlCon

//连接MySql数据库

try

{

mysql_init(&m_sqlCon)

// localhost:服务器 root为账号密码 test为数据库名 3306为端口

if(!mysql_real_connect(&m_sqlCon, "localhost","root","root","test",3306,NULL,0))

{

AfxMessageBox(_T("数据库连接失败!"))

return FALSE

}

return TRUE

}

catch (...)

{

return FALSE

}

(2)关闭数据库

mysql_close(&m_sqlCon)

(3)创建表

char* pQuery = "create table if not exists DS_Building( ID VARCHAR(10),Name VARCHAR(255),Descs VARCHAR(255),PRIMARY KEY (ID))"

if(mysql_real_query(&m_sqlCon,pQuery,(UINT)strlen(pQuery))!=0)

{

const char* pCh = mysql_error(&m_sqlCon)

return FALSE

}

附MySQL的API接口:

mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查询影响的行数。

mysql_close() 关闭一个服务器连接。

mysql_connect() 连接一个MySQL服务器。该函数不推荐;使用mysql_real_connect()代替。

mysql_change_user() 改变在一个打开的连接上的用户和数据库。

mysql_create_db() 创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。

mysql_data_seek() 在一个查询结果集合中搜寻一任意行。

mysql_debug() 用给定字符串做一个DBUG_PUSH。

mysql_drop_db() 抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。

mysql_dump_debug_info() 让服务器将调试信息写入日志文件。

mysql_eof() 确定是否已经读到一个结果集合的最后一行。这功能被反对mysql_errno()或mysql_error()可以相反被使用。

mysql_errno() 返回最近被调用的MySQL函数的出错编号。

mysql_error() 返回最近被调用的MySQL函数的出错消息。

mysql_escape_string() 用在SQL语句中的字符串的转义特殊字符。

mysql_fetch_field() 返回下一个表字段的类型。

mysql_fetch_field_direct () 返回一个表字段的类型,给出一个字段编号。

mysql_fetch_fields() 返回一个所有字段结构的数组。

mysql_fetch_lengths() 返回当前行中所有列的长度。

mysql_fetch_row() 从结果集合中取得下一行。

mysql_field_seek() 把列光标放在一个指定的列上。

mysql_field_count() 返回最近查询的结果列的数量。

mysql_field_tell() 返回用于最后一个mysql_fetch_field()的字段光标的位置。

mysql_free_result() 释放一个结果集合使用的内存。

mysql_get_client_info() 返回客户版本信息。

mysql_get_host_info() 返回一个描述连接的字符串。

mysql_get_proto_info() 返回连接使用的协议版本。

mysql_get_server_info() 返回服务器版本号。

mysql_info() 返回关于最近执行得查询的信息。

mysql_init() 获得或初始化一个MYSQL结构。

mysql_insert_id() 返回有前一个查询为一个AUTO_INCREMENT列生成的ID。

mysql_kill() 杀死一个给定的线程。

mysql_list_dbs() 返回匹配一个简单的正则表达式的数据库名。

mysql_list_fields() 返回匹配一个简单的正则表达式的列名。

mysql_list_processes() 返回当前服务器线程的一张表。

mysql_list_tables() 返回匹配一个简单的正则表达式的表名。

mysql_num_fields() 返回一个结果集合重的列的数量。

mysql_num_rows() 返回一个结果集合中的行的数量。

mysql_options() 设置对mysql_connect()的连接选项。

mysql_ping() 检查对服务器的连接是否正在工作,必要时重新连接。

mysql_query() 执行指定为一个空结尾的字符串的SQL查询。

mysql_real_connect() 连接一个MySQL服务器。

mysql_real_query() 执行指定为带计数的字符串的SQL查询。

mysql_reload() 告诉服务器重装授权表。

mysql_row_seek() 搜索在结果集合中的行,使用从mysql_row_tell()返回的值。

mysql_row_tell() 返回行光标位置。

mysql_select_db() 连接一个数据库。

mysql_shutdown() 关掉数据库服务器。

mysql_stat() 返回作为字符串的服务器状态。

mysql_store_result() 检索一个完整的结果集合给客户。

mysql_thread_id() 返回当前线程的ID。

mysql_use_result() 初始化一个一行一行地结果集合的检索。

import java.sql.*import java.util.*import java.io.*import java.text.*public class getAccessDB { public static void getInsert(Connection con){ String sql = "INSERT INTO basic VALUES ('L004','兰博基尼','2010/5/9','555555')" try{ PreparedStatement ps = con.prepareStatement(sql) ps.executeUpdate() //con.close() }catch(Exception e){ e.getMessage() } } public static Connection connect(){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") String url = "jdbc:odbc:myaccdb" Connection con = DriverManager.getConnection(url) return con }catch(Exception e){ System.out.println("wrong") e.getCause() return null } } public static void getSelect(Connection con,Statement st){ String sql = "select * from basic" try{ ResultSet rs = st.executeQuery(sql) while(rs.next()){ for(int i = 1i <= 4i++){ System.out.print(rs.getString(i)+" ") } System.out.println() } }catch(Exception e){ System.out.println("sssss") e.getCause() } } public static void close(Connection con)throws SQLException{ con.close() } public static void main(String[] args) { // TODO Auto-generated method stub try{ Connection con = connect() Statement st = con.createStatement() System.out.println("原始数据:") getSelect(con,st) System.out.println("插入数据为:'L004','兰博基尼','2010/5/9','555555'") getInsert(con) System.out.println("插入后:") getSelect(con,st) close(con) }catch(Exception e){ System.out.println("wrong") e.getCause() } }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9601879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存