Posted on 2009-01-26 20:46
laogao 阅读(2485)
评论(1) 编辑 收藏 所属分类:
On Python
ORM是个大话题,大到可能好几本书都说不完。SQLAlchemy,别看它刚出到0.5.2,已然是Python世界ORM的事实标准,受到众多开发者和无数框架的青睐。
如果之前没有或很少接触SQLAlchemy,那么学习Pylons可能有相当一部分时间都会花在SQLAlchemy上。通常,人们选择Pylons或者TurboGears而不是Django,SQLAlchemy在这些决定的背后有着很重的分量。作为Pylons学习笔记的一部分,接下来我将分4篇随笔介绍SQLAlchemy,分别是Engine API、Schema Management (MetaData/Types)、SQL Expression Language和Object Relational Mapper。此文为第1篇,重点介绍Engine API。
类似Java的JDBC,Python也有一个类似的数据库访问接口规范,那就是DB-API(目前是2.0),不同的常见RDBMS都有符合DB-API标准的Python库,比如PostgreSQL有psycopg2,Oracle有cx_Oracle等。有了这个基础,SQLAlchemy也就得以方便的通过DB-API连接不同的数据库。
以PostgreSQL为例,通过SQLAlchemy的Engine API访问数据库的代码可以这样来写:
1 from sqlalchemy.engine import create_engine
2
3 engine = create_engine('postgres://user:pass@localhost/testdb')
4 connection = engine.connect()
5 connection.execute(
6 """
7 CREATE TABLE book
8 (
9 id serial NOT NULL,
10 title character varying(30) NOT NULL,
11 CONSTRAINT pk_book PRIMARY KEY (id)
12 );
13 """
14 )
15 connection.execute(
16 """
17 INSERT INTO book (title) VALUES (%s);
18 """,
19 "The Art of UNIX Programming"
20 )
21 rs = connection.execute("SELECT title FROM book")
22 for row in rs:
23 print "Book Title: ", row['title']
24 connection.close()
基本步骤就是create_engine、connect、execute和close,没有很特别的地方,不过SQLAlchemy的Engine API,并不是简单的DBAPI调用,而是包装了其他内容,如数据库连接池,我们可以在create_engine的时候指定连接池参数和其他额外配置,类似这样:
engine = create_engine('postgres://user:pass@localhost/testdb', pool_size=10, convert_unicode=True)
类似Spring的JdbcTemplate,更多的时候,统一使用SQLAlchemy的Engine API而不是DB-API能给我们带来更大的灵活性,通常也更方便、更安全。