Python的ORM框架SQLObject入门实例


Posted in Python onApril 28, 2014

SQLObject和SQLAlchemy都是Python语言下的ORM(对象关系映射)解决方案,其中SQLAlchemy被认为是Python下事实上的ORM标准。当然,两者都很优秀。

一、安装

sudo pip install SQLObject

使用SQLObject操作mysql时候报错ImportError: No module named MySQLdb,那便安装MySQLdb:
sudo pip install MySQL-python

没想到又报错了:
_mysql.c:29:20: fatal error: Python.h: No such file or directory
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

解决方法:
sudo apt-get install libmysqlclient-dev python-dev

二、使用其创建表

将mysql默认存在的test数据库的编码改为utf-8。

#-*-encoding:utf-8-*-
from sqlobject import *
uri = r'mysql://root:passwd@127.0.0.1/test?charset=utf8'
sqlhub.processConnection = connectionForURI(uri)
class User(SQLObject):
    name = StringCol(length=10, notNone=True)
    email = StringCol(length=20, notNone=True)
    password = StringCol(length=20, notNone=True)
User.createTable()

运行后,会看到test数据库下出现表user,我们使用show create table user;查看user表的创建语句,结果如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `email` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

三、添加/删除记录

现在我们尝试着添加和删除记录。

user1 = User(name='user1',email='user1@163.com',password='111')
user2 = User(name='user2',email='user2@163.com',password='222')

运行后,使用select * from user能看到这两个记录:

mysql> select * from user;
+----+-------+---------------+----------+
| id | name  | email         | password |
+----+-------+---------------+----------+
|  1 | user1 | user1@163.com | 111      |
|  2 | user2 | user2@163.com | 222      |
+----+-------+---------------+----------+
2 rows in set (0.00 sec)

删除数据

u2 = User.get(2)
print User.delete(u2.id)

四、查询记录

通过id获取数据:

u1 = User.get(1)
u1_1 = User.get(1)
u2 = User.get(2)
print id(u1), u1
print id(u1_1), u1_1
print id(u2), u2

输出结果:
23864656 
23864656 
23930512

由于id(u1)和id(u1_1)是相等的,所以u1和u1_1是内容一致,这样做可以减少内存使用。可以在连接数据库时候设置参数,禁止该方式。

根据name进行查询:

users = User.select(User.q.name=="user1")
print users
print list(users)

输出结果:
SELECT user.id, user.name, user.email, user.password FROM user WHERE ((user.name) = ('user1'))
[]

模糊查询:
users = User.select(User.q.name.startswith('u'))
print users
print list(users)
users = User.select(User.q.name.contains('ser1'))
print users
print list(users)

运行结果:
SELECT user.id, user.name, user.email, user.password FROM user WHERE (user.name LIKE ('u%') ESCAPE '\\')
[, ]
SELECT user.id, user.name, user.email, user.password FROM user WHERE (user.name LIKE ('%ser1%') ESCAPE '\\')
[]

一对多映射

我们新建一个表,保存user中每个用户的编写的文章:

class User(SQLObject):
    name = StringCol(length=10, notNone=True)
    email = StringCol(length=20, notNone=True)
    password = StringCol(length=20, notNone=True)
class Article(SQLObject):
    title = StringCol(length=100, notNone=True)
    content = StringCol(notNone=True)
    user = ForeignKey('User')
Article.createTable()

运行后,使用show create table article查看创建语句:
CREATE TABLE `article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` text NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `article_user_id_exists` (`user_id`),
  CONSTRAINT `article_user_id_exists` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

添加数据:
u1 = User.get(1)
a1 = Article(title='title1',content='你好',user=u1)

查询数据:
u1 = User.get(1)
a1 = Article.select(Article.q.user == u1)
print a1
print list(a1)
print list(a1)[0].content

这种方式也可以:
a1 = Article.select(Article.q.userID == 1)
print a1
print list(a1)
print list(a1)[0].content

运行结果:
SELECT article.id, article.title, article.content, article.user_id FROM article WHERE ((article.user_id) = (1))
[<Article title='title1'>]
你好

Python 相关文章推荐
python发送arp欺骗攻击代码分析
Jan 16 Python
python实现按长宽比缩放图片
Jun 07 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
深入了解Python enumerate和zip
Jul 16 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 #Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 #Python
python抓取网页图片示例(python爬虫)
Apr 27 #Python
python实现sublime3的less编译插件示例
Apr 27 #Python
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 #Python
Python设计模式之单例模式实例
Apr 26 #Python
Python设计模式之观察者模式实例
Apr 26 #Python
You might like
一个oracle+PHP的查询的例子
2006/10/09 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
php基于curl重写file_get_contents函数实例
2016/11/08 PHP
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
六个窍门助你提高Python运行效率
2015/06/09 Python
Python中的集合类型知识讲解
2015/08/19 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python绘制直方图和密度图的实例
2019/07/08 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
EJB与JAVA BEAN的区别
2016/08/29 面试题
Ruby如何创建一个线程
2013/03/10 面试题
CAD制图人员的自荐信
2014/02/07 职场文书
优秀毕业生求职信
2014/06/05 职场文书
空气的环保标语
2014/06/12 职场文书
环境日宣传活动总结
2014/07/09 职场文书
创业计划书之旅游网站
2019/09/06 职场文书