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性能优化技巧
Mar 09 Python
使用Python生成url短链接的方法
May 04 Python
Python读写配置文件的方法
Jun 03 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
python实现windows倒计时锁屏功能
Jul 30 Python
Django多数据库配置及逆向生成model教程
Mar 28 Python
解决django 向mysql中写入中文字符出错的问题
May 18 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
python如何实现图片压缩
Sep 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
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
PHP7.0版本备注
2015/07/23 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
Python制作简单的网页爬虫
2015/11/22 Python
深入学习python的yield和generator
2016/03/10 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
Python之str操作方法(详解)
2017/06/19 Python
tornado 多进程模式解析
2018/01/15 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python3正则模块re的使用方法详解
2020/02/11 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
python 实现任务管理清单案例
2020/04/25 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
科室工作个人总结的自我评价
2013/10/29 职场文书
八年级生物教学反思
2014/01/22 职场文书
旅游网创业计划书
2014/01/31 职场文书
运输服务质量承诺书
2014/03/27 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技