DB-API
模块属性:
apilevel 字符串,表示本模块兼容的 API 版本号
threadsafety 线程安全级别
paramstyle SQL 语句参数风格
connect() 连接数据库的函数,返回一个连接对象
connect() 函数的参数包含 (user,password,host,database,dsn),但并不是所有模块都完全按照这个规范实现。例如
MySQLdb.connect(hos='dbserver',db='inv',user='smith')
PgSQL.connect(database='sales')
sqlite3.connect('marketing/test')
模块异常:
Warning 警告异常基类
Error 错误异常基类
InterfaceError 数据库接口错误
DatabaseError 数据库错误
DataError 数据错误
OperationalError 命令执行错误
IntegrityError 数据完整性错误
InternalError 数据库内部错误
ProgrammingError SQL 执行失败
NotSupportedError 数据库不支持该特性
连接对象的方法:
close() 关闭本连接
commit() 提交事务
rollback() 取消事务
cursor() 创建并返回一个游标或类游标对象
游标对象的属性:
arraysize fetchmany()方法的默认参数
connection 创建此游标的连接对象(可选)
description 返回游标活动状态(包含7个元素的元组):(name, type_code, display_size, internal_size, precision, scale, null_ok)只有 name 和 type_cose 是必需的
lastrowid 最近更新过的行 id,若数据库不支持行 id,返回 None
rowcount 最近一次 execute() 创建或影响的行数
callproc(func[,args]) 调用一个存储过程
close() 关闭本游标对象
execute(op[,args]) 执行一个数据库命令
executemany(op,args) 类似 execute() 和 map() 的结合,为给定的每一个参数准备并执行一个数据库命令
fetchone() 取得结果集的下一行
fetchmany([size=cursor.arraysize]) 取得结果集的下 arraysize 行
fetchall() 取得结果集剩下的所有行
__iter__() 创建一个可迭代对象(可选)
messages 游标执行后数据库返回的信息元组(可选)
next() 获取结果集的下一行(如果支持迭代的话)
nextset() 移到下一个结果集(如果支持的话)
rownumber 当前结果集中游标所在行的索引(起始行号为 0)
setinputsizes(sizes) 设置输入最大值(必须有,但具体实现是可选的)
setoutputsizes(sizes[,col]) 设置大列 fetch 的最大缓冲区大小
数据类型与构造器:
Date(yr,mo,dy) 日期
Time(hr,min,sec) 时间
Timestamp(yr,mo,dy,hr,min,sec) 时间戳
DateFromTicks(ticks) 自 1970-01-01 00:00:01 utc 以来的 ticks 秒数得到的日期
TimeFromTicks(ticks) 同上
TimestampFromTicks(ticks) 同上
Binary(string) 二进制(长)字符串
STRING 字符串列,如 VARCHAR
BINARY 二进制长列,如 RAW、BLOB
NUMBER 数字列
DATETIME 日期时间列
ROWID 行号
sqlite3 示例:
>>>
import sqlite3
>>>
cxn
=
sqlite3.connect(
'
sqlite_test/test
'
)
>>>
cur
=
cxn.cursor()
>>>
cur.execute(
'
CREATE TABLE users(login VARCHAR(8),
userid INTEGER)
'
)
>>>
cur.execute(
'
INSERT INTO users VALUES("john", 100)
'
)
>>>
cur.execute(
'
INSERT INTO users VALUES("jane", 110)
'
)
>>>
cur.execute(
'
SELECT * FROM users
'
)
>>>
for
eachUser
in
cur.fetchall(): print(eachUser) (
'
john
'
,
100
) (
'
jane
'
,
110
)
>>>
cur.execute(
'
DROP TABLE users
'
)
<
sqlite3.Cursor
object
at
0x3d4320
>
>>>
cur.close()
>>>
cxn.commit()
>>>
cxn.close()
ORM - SQLAlchemy
SQLAlchemy 用于操作数据库的三个主要对象是 Table 表对象、engine 数据库引擎对象 和 Session 会话对象。这三个对象分别对应了 ORM 系统的三层(数据、连接、事务)。Table 和Session 对象都需要和 engine 绑定后才能用,定义 Table 和绑定过程有多种实现方式,下面仅就使用类定义直接映射表的方式做一个示例 Users-(id,name):
这里导入了一些示例中实际用不上的类,主要是为了展示 sqlalchemy 模块的几项基本内容。自定义的表 Users 从一个 Base 类继承:
from sqlalchemy import Table,Column,Integer,String,MetaData,ForeignKey,create_engine from sqlalchemy.ext.declarative import declarative_base dsn
=
'
sqlite:///:memory:
'
sample
=
((
100
,
'
Ada
'
),(
101
,
'
Mario
'
)) Base
=
declarative_base()
class
Users(Base): __tablename__
=
'
users
'
user_name
=
Column(String(NAMELEN)) user_id
=
Column(Integer, primary_key
=
True)
下面是具体的 create、insert、update、delete、dump、drop 操作
>>>
eng
=
create_engine(dsn)
>>>
eng.connect()
<
sqlalchemy.engine.
base
.Connection
object
at
0x000000000BC304E0
>
>>>
Session
=
orm.sessionmaker(bind
=
eng)
>>>
ses
=
Session()
>>>
users
=
Users.__table__
>>>
users.metadata.bind
=
eng
>>>
users.create()
>>>
ses.add_all(Users(user_id
=
uid,user_name
=
name)
for
uid,name
in
sample)
>>>
ses.commit()
>>>
selected
=
ses.query(Users).filter_by(user_id
=
100
).all()
>>>
for
user
in
selected: user.user_name
=
'
Maria
'
>>>
ses.commit()
>>>
selected
=
ses.query(Users).filter_by(user_name
=
'
Mario
'
).all()
>>>
for
user
in
selected: ses.delete(user)
>>>
ses.commit()
>>>
selected
=
ses.query(Users).all()
>>>
for
user
in
selected: print(
'
%s
'
%
(user.user_id,user.user_name))
<
100
>
Maria
>>>
ses.commit()
>>>
users.drop(checkfirst
=
True)
>>>
ses.connection().close()
这里在调用 eng.connect() 的时候并没有保存连接对象的引用,而是在最后通过 ses.connection() 重新获取
Table 对象也没有直接用构造器创建,而是在定义了 Users 类后通过其父类的 __table__ 属性来引用
MetaData 是实际包含表的对象,Table 的构造器需要两个参数,就是字符串的 'table_name' 和 一个 MetaData——Table('myTable',metadata,...)
Table 构造器只会创建唯一一个实例,使用相同参数重复调用的结果也总是返回最初的那一个实例
Matadata 的 bind 属性可以动态绑定。因此一般的做法都是先以非绑定的状态开始,随后在有了可用的 engine 对象后再实行绑定
更多内容请使用 help() 函数获取