WEB开发网
开发学院软件开发Python SQLAlchemy学习]学习第一天 阅读

SQLAlchemy学习]学习第一天

 2008-11-10 13:23:21 来源:WEB开发网   
核心提示:为什么要学 管它呢?先学着,感觉 SQLObject 在 NewEdit 中的 RssReader 导入太慢,SQLAlchemy学习]学习第一天,自已重写又嫌麻烦,正好看到 xlp223 推荐了这个,不过不知道如何自动判断一个表是否已经存在,如果一个表已经存在,先学着再说,第一印象:很有特色

为什么要学

管它呢?先学着。感觉 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 学习 学习

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接