tg2使用及启用dbmechanic遇到的小问题


                                    TG2已经更新到a4,据说还可能会有一个alpha5。不过总的来说,基本上稳定了,可以用了,也更像TG1了,虽然完整度上还比不上。
    因为TG2的默认组件与TG1明显不同,使用了SA,Genshi, TW,导致了严重依赖SO,KID,WIDGET的toolbox不能在TG2上使用,Toolbox2还在开发中。现在TG2使用了
dbsprockets以及它的DBMechanic,有些类似django的admin。
    我想试用下,感觉感觉。
1.安装virtualenv
>easy_install virtualenv
... virtualenv-1.2 installed
2.建立tg2的virtualenv
d:\pyweb>virtualenv --no-site-packages tg2a4
....done
--no-site-packages的意思是自己的第三方包只会安装到自己的虚拟环境目录下,(如tg2a4\lib\site-packages\,而不会安装到真实的python安装目录下。
3.切换到tg2a4虚拟环境下。
d:\pyweb>cd tg2a4
d:\pyweb\tg2a4>scripts\activate.bat
(tg2a4)d:\pyweb\tg2a4>   注意(tg2a4)说明已经处于tg2a4虚拟环境下
4.我在这个目录下建立一个project目录,在其中生成一个示例。
(tg2a4)d:\pyweb\tg2a4> mkdir project
(tg2a4)d:\pyweb\tg2a4> cd project
(tg2a4)d:\pyweb\tg2a4\project> paster quickstart
   ...... [project] web online
   ...... ..
   ...... [identity] yes
   ......
自动生成目录,切换进项目目录,webonline
5.这里只是测试,就没有在新建model了,直接生成表
(tg2a4)d:\pyweb\tg2a4\projec\webonline> paster setup-app development.ini
会调用d:\pyweb\tg2a4\projec\webonline\webonline\websetup.py来生成对应的数据库和表
6.启动服务,浏览网页
(tg2a4)d:\pyweb\tg2a4\projec\webonline> paster serve --reload development.ini
.... 0.0.0.0:8080
访问没有问题,
7.启用管理页面,其实主要是浏览和更改数据用的。
(tg2a4)d:\pyweb\tg2a4\projec\webonline> vim webonline\controllers\root.py
vim是一个编辑器,可以使用任何一款编辑器都可以。
[/url]

               
               
                from tg import redirect, validate
from abc.model import DBSession, metadata
from dbsprockets.dbmechanic.frameworks.tg2 import DBMechanic #去掉前面的注释
from dbsprockets.saprovider import SAProvider                #去掉前面的注释
class RootController(BaseController):
    admin = DBMechanic(SAProvider(metadata), '/admin')       #去掉前面的注释
基本上和DBMechanic相关的都要把前面的注释去掉。
重新访问http://localhost:8080/admin
可以显示,但点示任何一个表名,如"tg_user",出错,说末绑定错误,大致意思是说没有关联到engine或metadata上不能执行sql语名("UnboundExecutionError: This Select object is not bound and does not support direct execution")
8.翻查tg2a4的changlog,文档和
[url=http://code.google.com/p/dbsprockets/]dbsprockets的文档和论坛。知道了解决方法。
关键在于webonline\model\__ini__.py的"def init_model()"方法中,metadata没有绑定engine
修改如下:
def init_model(engine):
    DBSession.configure(bind=engine) # not really needed if engine is
bound to metadata but anyway...
    metadata.bind = engine # -- this, add this if using dbsprockets
9.在TG2中,为了支持同时使用多数据库,在TG2a4中,不再在def init_model()中设置meta.bind=engine,需要手式添加,同样你可以添加多个metadata,绑定到不同的engine上
如: , metadata1.bind=engine1, metadata2.bind=engine2,.....
不同的engine对应不同的数据库,上层程序只要使用不同的metadata生成使用表就可以了。
10. 总的来说,我觉得生成项目时,还是应该加上这个,至少应该加上并注释。初学者或不需要多数据库支持者可以最快的使程序运行起来,这第一印象是很重要的。
另外,dbmechanic的界面比较难看。比起django admin来说,美化上还是有很大改进空间的。