Python写的数据抽象层

作者 : admin 于 2009年03月30日, 11:26:09
2009
03-30

python本身没有对mysql的支持,得依赖附加的库 http://mysql-python.sourceforge.net 。很多框架采用了这个库,比如adodb,django等。不过我倾向于自己写这些东西,所以小研究了一下。 mysql-python 有两个对象 MySQLdb _mysql 这里是介绍http://mysql-python.sourceforge.net/MySQLdb.html,我使用的是 MySQLdb 对象

  1. #!/D:\python25\python.exe
  2. import MySQLdb
  3.  
  4. class Mysql(object):
  5.     handle = ''
  6.     query = ''
  7.     exectime = 0
  8.     effected = 0
  9.  
  10.     def __init__( self , hostname , username , password , database ):
  11.         db = MySQLdb.connect( host = hostname , user = username , passwd = password , db = database )
  12.         self.handle = db.cursor()
  13.         
  14.     def query( self , sql = '' ):
  15.         return self.handle.execute( sql )
  16.  
  17.     def fetch( self , sql = '' ):
  18.         self.handle.execute( sql )
  19.         rs = self.handle.fetchone()
  20.         count = 0
  21.         result = {}
  22.         for colnum in self.handle.description:
  23.             result[colnum[0]] = rs[count]
  24.             count += 1
  25.         return result
  26.     
  27.     def fetchAll( self , sql = '' ):
  28.         self.handle.execute( sql )
  29.         result = {}
  30.         bigcount = 0
  31.         for recordline in self.handle.fetchall():
  32.             littlecount = 0
  33.             result[bigcount] = {}
  34.             for colnum in self.handle.description:
  35.                 result[bigcount][colnum[0]] = recordline[littlecount]
  36.                 littlecount += 1
  37.             bigcount += 1
  38.         return result
  39.  
  40.     def insertID( self ):
  41.           self.handle.execute("SELECT LAST_INSERT_ID() AS lid")
  42.           rs = self.handle.fetchone()
  43.           return rs[0]
  44.  
  45.     def close( self ):
  46.           self.handle.close()
  47.           pass
  48. #DEMO
  49. db = Mysql('localhost','root','123456','frame')
  50. db.fetchAll('select * from user')
  51. #rs = db.fetchAll('select * from user')
  52. #sql = "INSERT INTO tags (module,fid,name,note,`order`) VALUE ('test',1,'fd','ds',1)"
  53. #db.query(sql)
  54. #print db.insertID()

几个画蛇添足的函数,出自我手

作者 : admin 于 2009年03月18日, 01:20:14
2009
03-18

翻看自己以前的代码,发现自己的一些搞笑的函数,列一个

  1. function func_arrtoQuerystring($array)             #其实就是http_build_query
  2. {
  3.     $string = '?';
  4.     foreach($array as $key=>$value)
  5. {
  6.     $string .= $key.",".$value.";";
  7. }
  8. $string = substr($string,0,substr($string)-1);
  9. $string .= ".html";
  10. return $string;
  11. }

回头多找几个这样的,自勉

SVN自动提交那个钩子

作者 : admin 于 2009年03月17日, 18:30:33
2009
03-17

首先那个版本得检出一下 /opt/subversion-1.4.3/bin/svn checkout svn://svn.sunboyu.cn:**/python/sso /home/project/sso

  1. export LANG=zh_CN.UTF-8   #中文支持
  2. REPOS="$1"
  3. REV="$2"
  4. SVN=/opt/subversion-1.4.3/bin/svn  #svn的地址
  5. DIR=/home/main                         #目标地址
  6. /opt/subversion-1.4.3/bin/svn update /home/main       #执行

file_get_contents函数使用post方法

作者 : admin 于 2009年03月16日, 12:27:44
2009
03-16

以前总用socket的方式发送接收http的包,结果收到的包也有一堆http的协议头信息。
处理这些信息还挺费劲的。

然后想到了file_get_contents($url)方法,可以得到纯净的http包的正文。但这种方式默认是get的方式,后查手册和搜索,得到了post的方法。

这种方式基本跟socket的方式相同,包头构建好即可。

  1. $array = array ('a' => 'b','c'=>'d');
  2. $url= http_build_query($array );
  3. $postdate = array (
  4.     'http' => array (
  5.         'method' => 'POST',
  6.         'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .
  7.                    "Content-Length: " . strlen($url) . "\r\n",
  8.         'content' => $url
  9.     ),
  10. );
  11. $postcontent = stream_context_create($postdate );
  12. $return= file_get_contents('http://www.sunboyu.cn', false, $postcontent ); 
  13. echo $return;

解决了该死的权限问题,是否真的有效

作者 : admin 于 2009年03月12日, 23:43:34
2009
03-12

我的apache+php权限是配置的最为严格的,当然,在用的时候难免伴随着混乱的账户情况,linux的权限机制也是很让人头疼的,终于,还是在风平浪静种碰到了麻烦。

我不认为PHP很强,因为它只是一个面向Web的脚本语言,而PHP的开发者却赋予了它太多,让人去用,有人也滥用。

当然,一门语言能解决N多问题是好的,比如汇编,C,但终究PHP有它跨不过的坎。毕竟它只是web脚本语言。

权限出现很大的问题,至今没有搞透,说白了对linux还是一知半解,使用python写了个第三方的东西,很完美得跳跃了权限的问题。至于效率,python肯定要比php强的,起码PHP作为服务器端程序运行,PHP还没有线程和进程的控制(一直没有发现),python有完善的线程进程的库。在权限管理上,python没细看,PHP在linux下有posix函数库,我一直也没有用过。

在没有更好的解决方案前,我依然用PHP做服务器端程序,python作为一些补充。也许,全部切换过去。

做完数据库抽象层,可能要做一个通用的缓存层

作者 : admin 于 2009年03月07日, 14:17:49
2009
03-7

数据抽象层实现了Mysql和SQLite的兼容,基本也就够用了,基本所有的PHP环境现在都支持sqlite(起码我配的环境是),而且扩展的过程证明了这个规则是可以通用的。

低下要做个通用的缓存层,基本就是 key value 这种简单映射的就足够。这种缓存目前实现主要有本地文本,bdb,memcache几大系列。本地文本异常灵活,方便迁移,不依赖其他组件,直接用PHP的文件读写函数就可以。缺点是,未有大规模系统使用,因为PHP本身效率问题。小的应用还是可以使用的,phpx上也有个三德子写的通用文本缓存类。

bdb就非常不错了,嵌入式的数据库,支持简单的key value模式,而且本身非常小,但效率高,支撑非常大的数据量。

memcache就不用说了,太通用了,很多大型的系统都在应用,优缺点不再重复。

抽象层兼容这几个就行了,能实现无缝迁移即可。

计划下周末开工。

SQLite牛刀小试

作者 : admin 于 2009年03月07日, 02:07:28
2009
03-7

这玩意据说跟bdb一样,嵌入式数据库,正好嵌到了PHP上边,因为写框架,框架里新添加了一个功能,就是管理模块的一个模块,本想用mysql来做,又一想,用mysql,那迁移起来可麻烦了,不运行一个install就没法部署了,不如把功能直接镶嵌,直接使用。
SQLite跟mysql一样,是关系型数据库,而且功能都类似,我直接使用原来的接口,写了一个数据抽象层,直接挂接到原框架里,很好用。
SQLite管理,我还找了两个工具,一个桌面版的,类似mysql front ,一个web版的,看来就像phpmyadmin了。

413 Request Entity Too Large

——————————————————————————–

nginx/0.5.34

FUCK Nginx HOST

那个sqlitemanager http://www.sqlitemanager.org/

代码如下,因为使用不多,临时用一下,所以细节没怎么处理,待出问题的时候再来修改。

  1. < ?php
  2. /*  DB.SQLite.Class.php
  3.  *  SQLite
  4.  *  @link        http://www.sunboyu.cn
  5.  *  @package     OA
  6.  *  @version     V1.0
  7.  *
  8.  *  2009 03 07  sunboyu@gmail.com
  9.  *  Demo
  10.  */
  11. require_once(ROOT."/Include/Class/DB.InterFace.php");
  12. class SQLite implements DateBaseConnect
  13. {
  14. #连接标识
  15. public $handle = false;
  16. #结果标识
  17. public $query;
  18. #查询次数
  19. public $exetime;
  20. #数据库连接
  21.     public function Connect( $argvs )
  22. {
  23. $this->handle = @sqlite_open( $argvs['hostname'].'/'.$argvs['datebase'] , $argvs['mode'] , $sqliteerror );
  24. if(!$this->handle)
  25. {
  26. die("Can't connect to the datebase ".$argvs['datebase']);
  27. }
  28. $this->exetime = 0;
  29. }
  30. #使用数据库
  31. public function selectDateBase( $datebase )
  32. {
  33. #此方法无用
  34. return true;
  35. }
  36. #执行一个查询
  37. public function query( $sql )
  38. {
  39.         #echo $sql;
  40. $this->query = sqlite_query( $sql , $this->handle ) or die("query error".sqlite_last_error( $this->handle ));
  41. $this->exetime++;
  42. return true;
  43. }
  44. #取得一行
  45. public function fetch( $sql )
  46. {
  47. $this->query( $sql );
  48. while( $row = mysql_fetch_array( $this->query, MYSQL_ASSOC ) )
  49. {
  50. return $row;
  51.     }
  52. return false;
  53. }
  54. #取得所有
  55. public function fetchAll( $sql )
  56. {
  57. $this->query( $sql );
  58. return sqlite_fetch_all( $this->query );
  59. }
  60. #取得影响行数
  61. public function affectedRow()
  62. {
  63. return true;
  64. }
  65. #取得结果行数
  66. public function recordCount()
  67. {
  68. return sqlite_num_rows( $this->query );
  69. }
  70. #取得上次插入ID
  71. public function insertID()
  72. {
  73. return false;
  74. }
  75. #释放资源
  76. public function close()
  77. {
  78. unset( $this->handle );
  79. }
  80. #析构函数
  81. /*
  82. function __destruct()
  83. {
  84. $this->close();
  85. }
  86. */
  87. }
  88. ?>

给代码打上版本号

作者 : admin 于 2009年03月03日, 23:55:20
2009
03-3

这个版本号,当然不是svn的版本号。

写程序再多,很多情况还是考虑不清楚。有时候代码耦合度并不能合理权衡,一旦升级某项功能,大改一下也是难免。但大换血式的更改代码是很忌讳的,尤其是运行很稳定的程序。

迫不得已,流程要修改,而且可能是截断了某个流程,创建分支,这时候,如果有一个版本的控制,那只需要更新特定的版本文件,即可实现无缝升级。当然,如果不稳定,可以迅速实现代码版本的回滚。

不过这种情况要求程序模块松散耦合,当你有紧耦合代码需要调整的时候,可以享受版本切换带来的享受。

重写框架

作者 : admin 于 2009年03月01日, 12:06:52
2009
03-1

其实我有两个框架,一个是比较简单的框架,适用于多人生产,只是拿出了框架的一些基本特性,便于由程序员自由发挥,又不缺乏一个基本的规则。

另一个是cakephp的“高仿版”,虽然是一个完整的框架,但学习成本高,另外扼杀了程序员的天性,所以,不再更新。

这次更新的是第一个框架,因为投入了生产,暴露了很多问题,这次的目标,首先是一个完善的框架系统,另外继承很多的应用实例。

另外一些LAMP应用脚本也会适当集成,当然得是拥有root的人才能使用这些功能。

主框架依然是PHP类库,路由,JS库(考虑是否集成JQUERY)