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和shell实现的校验IP地址合法性脚本分享
Oct 23 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
Python计算字符宽度的方法
Jun 14 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
Jun 19 Python
Python SSL证书验证问题解决方案
Jan 13 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
如何基于python实现不邻接植花
May 01 Python
基于Python实现2种反转链表方法代码实例
Jul 06 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
python中pdb模块实例用法
Jan 15 Python
python绘图模块之利用turtle画图
Feb 12 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
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
YII框架关联查询操作示例
2019/04/29 PHP
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
js实现日历的简单算法
2017/01/24 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
python 默认参数问题的陷阱
2016/02/29 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
python中os模块详解
2016/10/14 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
阿尔卡特(中国)的面试题目
2014/08/20 面试题
final, finally, finalize的区别
2012/03/01 面试题
校本教研工作方案
2014/01/14 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
医院信息公开实施方案
2014/05/09 职场文书
老公保证书怎么写
2015/02/26 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python