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分割文件的常用方法
Nov 01 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
Python 多核并行计算的示例代码
Nov 07 Python
好的Python培训机构应该具备哪些条件
May 23 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
python远程连接MySQL数据库
Apr 19 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
python tkinter基本属性详解
Sep 16 Python
python3 动态模块导入与全局变量使用实例
Dec 22 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 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 class类的用法详细总结
2013/10/17 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
详解PHP中的Traits
2015/07/29 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
json2.js的初步学习与了解
2011/10/06 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
js中indexof的用法详细解析
2013/12/24 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
webpack优化的深入理解
2018/12/10 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
Vue数据双向绑定底层实现原理
2019/11/22 Javascript
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
python如何保证输入键入数字的方法
2019/08/23 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
新郎新娘婚礼答谢词
2014/01/11 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
先进个人事迹材料
2014/12/29 职场文书
2015年植树节活动总结
2015/02/06 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
浅谈Python魔法方法
2021/06/28 Java/Android
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL