python数据库api_Python 数据库参考(DB–API & ORM)

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() 函数获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值