封装的python mysql操作ORM类
这段时间写项目用了python的mysql模块,觉得sqlalchemy太庞大就自己封装了一个简单的基于mysql-python的ORM文件。功能目前刚好够用以后会慢慢完善。这个操作类中解决了python编码和入mysql库编码不统一的问题,同时还解决了mysql的反斜杠'\'会被转义丢弃的问题。
1、安装mysql-python模块
python的mysql操作需要安装mysql-python库,安装方法如下。
sudo pip install MySQL-python
如果安装的时候报错,提示EnvironmentError: mysql_config not found,请安装libmysqld-dev
2、我的mysql-python封装操作模型
首先是mysql连接配置文件config.py:
#Mysql配置 mysql_host='localhost' mysql_user='root' mysql_passwd='12345' mysql_db='test' mysql_charset='utf8'
然后是封装的操作类,由于代码比较长,请移步github查看。下面我说下简单的用法:
#!/usr/bin/python #-*- coding:utf-8 -*- #在config.py里配置数据库连接 from mysql_conn import myMdb mydb = myMdb() #新建表结构 mydb.setTable('testtablename', "(`test_id` int(10) NOT NULL AUTO_INCREMENT,`test_col1` varchar(255) NOT NULL,`test_col2` varchar(255) NOT NULL, PRIMARY KEY (`test_id`), KEY `test_col1` (`test_col1`), KEY `test_col2` (`test_col2`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;" ) #新增数据记录 tag = mydb._insert({'test_col1':'123','test_col2':'455'})._from('testtablename').execute() print tag #修改数据记录 tag = mydb._update({'test_col2':'456'})._from('testtablename')._where({'column':'test_id','data':'1','relation':'='}).execute() print tag #删除数据记录 tag = mydb._delete()._from('testtablename')._where({'column':'test_id','data':'3','relation':'<'}).execute() print tag #查询前100条数据并排序 rs = mydb._select('*')._from('testtablename')._where({'column':'test_col1','data':'123','relation':'='})._where({'column':'test_col2','data':'456','relation':'!='})._limit(100,1)._order({'test_id':'DESC'}).execute() print rs #两表联合查询 rs = mydb._select('a.*')._from('testtablename_1','a')._leftjoin('testtablename_2','b','a.test_col1=b.test_col1')._where({'column':'a.test_col1','data':'123','relation':'='}).execute() print rs #支持上下文管理方式调用 with myMdb() as mydb: tag = mydb._insert({'test_col1':'123','test_col2':'455'})._from('testtablename').execute() print tag #打印调试最近一次执行的sql语句 print mydb.getsql
如果使用mysql-python官方扩展的时候报错
OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")
其原因是我将mysql的sock文件已经调整到/tmp/mysql.sock,所以必须在mysqldb中指定sock的路径,unix_socket参数指定了sock文件的路径
mdb.connect(host=config.mysql_host, user=config.mysql_user, passwd=config.mysql_passwd, db=config.mysql_db, charset=config.mysql_charset, unix_socket='/tmp/mysql.sock')