sqlalchemy:把sqlalchemy的result当成struct使用

  在述说下面编程故事的前:先把结论写在前面:

  结论:

  python是动态语言,解释型编程.有什么问题,就到他shell中去试验下,会有找好多问题!前面篇文章"python:logging注意事项(小心重复记录相同日志).<----removeHandler"也是这样去解决!需要dbconn.py可以到"mysql+pickle代替ZODB"文章中去下载dbconn.tar里面有类似类.

  #######################编程故事开始了######################

  在修改pyton下时候,发现如果把原来改为改变话,会出现些特别需求.

  原描述:使用django操作数据库.

  现描述:需要改为sqlalchemy操作数据库.

   django使用了models.py(对象)来操作数据库.这样每个对象就就拥有了数据库field属性.在中可以直接这个属性写.而我们要求是用sqlalchemy连接数据库,但是不用sqlalchemy建表(手工建表),所以就不需要写sqlalchemy类型table语句.

   有需要使用django模板渲染.其中要求models.py给出对象属性.思路方法为:adv.title.介绍下:个对象为adv对象,这样可以从数据库中取得记录(id,title,kwd).

   实现改变了.就必须也要做到这样:建,包含特定表属性.从数据库中取出数据,并复制给这些属性.django使用才会很方便使用,才能够做到最下改变.实现NewDb.py

   问题是:中有n张表,就要建立n个.这是个很费力事情.不仅仅如此,还得做测试.我想没有多少人愿意做这样重复事情.而且功能并没有得到实现.

   最开始:我没有明白这个需求.以为可以如下做就可以了:

  adv = DbResult( result )#

  pr adv["title"]

  ##############################

  经过我们伟大同事同意我这样做的后,我就大张旗鼓工作了!!!!!!!!!!!直奔主题写了个下午(刚开始工作不久,所以不熟悉python东西,所以请你不要笑话我哦~~)最终写了dbconn_test.py下DbResult类.

  觉得很了不起,毕竟比NewDb.py简单了n倍.n = n张表.拿来给我那位伟大同事看时候,结果是:django模板的认adv.title不认adv["title"].我气死了~如果可以再活过来话,我愿意气死~~~

  我明明白白和他说过;这种使用思路方法是这样adv["title"]~~还给他看过我原来例子~~

  是我错,没有明白django模板渲染思路方法~难道非这样"adv.title"使用不可吗,不可以"adv["title"]"这样来渲染吗?这里留下个疑问!在我不了解模板的前就开始做了~~不好意思~公司没有那么时间让我去学习~留待以后去发觉django模板吧!先为自己挖个坑!

  不爽~浪费了时间~责备是没有用~只能够说:"没有办法!还是用你写东西吧!测试我不做哦!这个测试太枯燥!"

  现在想来,也是我个交流问题吧!自责也没有用,以后多多注意了哦!

  #####################################################################

  夜晚,在公司,我做了其他事情...

  回去了,还是很不爽.毕竟时间浪费了,还没有效果出现!

  第 2天,到了公司.我总是觉得如果按NewDb.py来写话,是很费力气事情.虽然这个事情,我可以不管了.但是我脾气就是这样,总想着去解决点东西.

  如是做了以下事情:

  >>> import dbconn

  >>> db = dbconn.Db( "mysql://root:[email protected]/keyword" )

  >>> rst = db.query( "select * from adv_urlqueue where flg = '0'" )

  s_sql = [select * from adv_urlqueue where flg = '0']

  2008-04-18 13:29:17,030 INFO sqlalchemy.engine.base.Engine.0x..90 select * from adv_urlqueue where flg = '0'

  2008-04-18 13:29:17,046 INFO sqlalchemy.engine.base.Engine.0x..90 None

  >>> rst.rowcount

  1L

  ###########################################

  从这里可以看到已经取出数据.

  查看下rst些属性和思路方法吧

  >>> dir( rst )

  ['AmbiguousColumn', '_ResultProxy__echo', '_ResultProxy__key_cache', '_ResultProxy__keys', '_ResultProxy__props', '____', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__iter__', '__module__', '____', '__reduce__', '__reduce_ex__', '__repr__', '__attr__', '__str__', '__weakref__', '_convert_key', '_fetchall_impl', '_fetchmany_impl', '_fetchone_impl', '_get_col', '_has_key', '_init_metadata', '_process_row', 'close', 'closed', 'connection', 'context', 'cursor', 'dialect', 'fetchall', 'fetchmany', 'fetchone', 'keys', 'last_inserted_ids', 'last_inserted_params', 'last_updated_params', 'lastrow_has_defaults', 'rowcount', 'scalar', 'supports_sane_rowcount']

  ##############################

  矣?有keys这个思路方法,试试看如何用!

  >>> rst.keys

  Traceback (most recent call last):

  File "<eractive input>", line 1, in <module>

  TypeError: 'list' object is not callable

  ###############################

  出错了!!!

  >>> l = rst.keys

  >>> l

  ['id', 'url', 'flg', 'create_time']

  #########################

  可以这样用!!!!

  试验到了这里,如果你用过python话,应该知道只有dict类型才有keys.使用思路方法如下:

  >>> mydict = { "id":1,"url":"www","flg":0,"create_time": "2008"}

  >>> mydict.keys

  <built-in method keys of dict object at 0x016DB810>

  >>> mydict.keys

  ['url', 'create_time', 'id', 'flg']

  奇怪了!!

  ############################

  >>> mydict.url

  Traceback (most recent call last):

  File "<eractive input>", line 1, in <module>

  AttributeError: 'dict' object has no attribute 'url'

  >>> mydict["url"]

  'www'

  ###############################

  rst会如何样用这个keys呢?

  我就想不明白如何用这个keys!!不过,我们昨天不是需要adv.title吗?那么我就这样试试吧!

  >>> rst.url

  Traceback (most recent call last):

  File "<eractive input>", line 1, in <module>

  AttributeError: 'ResultProxy' object has no attribute 'url'

  ########################

  出错了!

  前面dir(rst)找到了个思路方法:fetchone

  拿来试试!!

  >>> rst.fetchone

  (1L, 'www', 0L, datetime.datetime(2011, 11, 11, 11, 1))

  ##ok!

  >>> f = rst.fetchone

  >>> f.keys

  <bound method RowProxy.keys of (1L, 'www', 0L, datetime.datetime(2011, 11, 11, 11, 1))>

  >>> f.keys

  ['id', 'url', 'flg', 'create_time']

  ######必须你数据库中有多条数据.否则你得从新执行rst = db.query( "select * from adv_urlqueue where flg = '0'" ).

  ########################################

  继续试验!

  >>> f.url

  'www'

  ###########################

  哈哈,有结果了~~~~这就是我想要结果!

  我虽然没有做什么事情,但是解决了个问题!不用写NewDb.py中n个类了!

  兴奋了我好阵子!现在想想,我也确实为自己骄傲!

  结论:

  python是动态语言,解释型编程.有什么问题,就到他shell中去试验下,会有找好多问题!前面篇文章"python:logging注意事项(小心重复记录相同日志).<----removeHandler"也是这样去解决!



Tags:  typedefstruct struct pythonsqlalchemy sqlalchemy

延伸阅读

最新评论

发表评论