Posted on 2009-01-26 20:46
laogao 閱讀(2500)
評論(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能給我們帶來更大的靈活性,通常也更方便、更安全。