这段时间写项目用了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 importmyMdb
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()printtag#修改数据记录
tag = mydb._update({'test_col2':'456'})._from('testtablename')._where({'column':'test_id','data':'1','relation':'='}).execute()printtag#删除数据记录
tag = mydb._delete()._from('testtablename')._where({'column':'test_id','data':'3','relation':'<'}).execute()printtag#查询前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()printrs#两表联合查询
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()printrs#支持上下文管理方式调用
with myMdb() as mydb:
tag= mydb._insert({'test_col1':'123','test_col2':'455'})._from('testtablename').execute()printtag#打印调试最近一次执行的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')