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中装饰器的用法
Apr 27 Python
Python中super关键字用法实例分析
May 28 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
python中lambda()的用法
Nov 16 Python
Python中一行和多行import模块问题
Apr 01 Python
Tensorflow 同时载入多个模型的实例讲解
Jul 27 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
pygame实现非图片按钮效果
Oct 29 Python
Python Flask异步发送邮件实现方法解析
Aug 01 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
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
Python实现的RSS阅读器实例
2015/07/25 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
新媒传信软件测试面试题
2013/02/24 面试题
传媒专业推荐信范文
2013/11/23 职场文书
护士思想汇报
2014/01/12 职场文书
户外用品商店创业计划书
2014/01/29 职场文书
家长寄语大全
2014/04/02 职场文书
爱心捐助倡议书
2014/05/19 职场文书
cf战队收人口号
2014/06/21 职场文书
临时租车协议范本
2014/09/23 职场文书
特岗教师个人总结
2015/02/10 职场文书
统计员岗位职责范本
2015/04/14 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书