SQLAlchemy学习]学习第一天
2008-11-10 13:23:21 来源:WEB开发网为什么要学
管它呢?先学着。感觉 SQLObject 在 NewEdit 中的 RssReader 导入太慢,自已重写又嫌麻烦。正好看到 xlp223 推荐了这个,先学着再说。第一印象:很有特色。不过用得人较少。订阅了它的邮件列表也没见有许多人发信。
学习没有太明确的目标,反正是希望替换掉整个 RssReader 的东西。很可能以它为实现的目标。
SQLAlchemy 支持多种数据库,有SQLite, Postgres, MySQL, and Oracle,看到它的许多例子都以 Sqlite 为例,我很高兴,因为我喜欢使用 Sqlite 这个小型的数据库。我想它对 sqlite 的支持应该很好。以后的学习都以 sqlite 为主。
创建一个数据引擎
from SQLAlchemy import *
sqlite_engine = create_engine('sqlite://filename=d:/test.db')
这是使用了近似协议的描述方式。还可以传入字典方式:
from sqlalchemy import *
sqlite_engine = create_engine('sqlite', {'filename':'d:/test.db'})
这是最简单的。还可以带参数:
echo=True 表示输出调试结果,缺省为stdout
logger为一个类文件对象(不是一个文件名),当echo=True时用来输出。缺省为stdout
还有其它几个参数,暂时用不上就不管它了。
然后就是表结构的描述了。
使用MetaData进行描述表结构
这里采用的不是象 SQLObject 和 django 一样的类方式描述,而是更接近于 Create table 语句,不过,这种方式我更习惯。
对于新建的表可以自行定义,并且 SQLAlchemy 提供了相应的create()和drop()方法。但不象 SQLObject 一样可以自动判断表是否存在(目前我在 SQLAlchemy 还没有发现)。同时也提供同其它一样的自动从已经存在的数据库创建相应的 MetaData 对象。
建表就象写一个 SQL 语句,如以 Rss Reader 为例:
RssCategory = Table('rss_category', sqlite_engine,
Column('id', Integer, primary_key = True),
Column('title', String, nullable = False)
)
主个很简单,但是我也发现有趣的东西。在 SQLAlchemy 的文档中,象String类型一般都有长度,写为String(10)之类的。那么如果我想不要长度呢?就使用上面的 String 就行了。而相应的源码我查了一下, String 是一个类,当长度为空时,最终会返回一个 TEXT() 的实例。因此它会根据有没有长度自动选择合适的对象。不过这又引出一个问题,Integer是类,而 String(10) 则是实例,不知道 SQLAlchemy 是如何区分的。不过,我也懒得去细看了,反正知道这里可以用类的形式,也可以用实例的形式,最终都会是实例的形式。做这样的判断倒也并不困难。
整个结构看上去就象是 Create 语句,先是一个表名(要指定),然后是一个引擎对象,后面是字段定义。与 django 或 SQLObject不同,这里没有什么 magic 的处理方法,一些都显得原始。不过也少了许多的猜测。字段定义可以带一些参数,如 primary_key, nullable这两个都容易明白。还有key表示可以起一个别名。
然后调用 table 对象的 create() 来创建表。
RssCategory.create()
这时,如果你在 sqlite_engine 创建时,加入了前面所写的 echo=True 参数,你会看到有 SQL 语句输出:
CREATE TABLE rss_category(
id INTEGER NOT NULL PRIMARY KEY,
title TEXT NOT NULL
)
看到了吧,String变成了 TEXT 了。
一旦建好表,就可以非常方便地访问表了。不过现在表里没有数据呢。如果想删除则执行表对象的 drop() 方法即可。不过不知道如何自动判断一个表是否已经存在。
如果一个表已经存在,那么 SQLAlchemy 还可以自动反射(reflect)出来。
rss = Table('rss_category', sqlite_engine, autoload=True)
然后可以使用 rss.c.keys() 看到所有的字段名 ['id', 'title']
Tags:SQLAlchemy 学习 学习
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接