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中with语句的用法
Apr 15 Python
python2.7安装图文教程
Mar 13 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
python实现串口自动触发工作的示例
Jul 02 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
浅谈python中的多态
Jun 15 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 Python
Python自动化实战之接口请求的实现
May 30 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
WHOIS类的修改版
2006/10/09 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
js日历功能对象
2012/01/12 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Python格式化输出%s和%d
2018/05/07 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
浅谈Python中的继承
2020/06/19 Python
python批量修改文件名的示例
2020/09/27 Python
自我评价如何写好?
2014/01/05 职场文书
十岁生日父母答谢词
2014/01/18 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
《石榴》教学反思
2014/03/02 职场文书
临时租车协议范本
2014/09/23 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
生产车间管理制度
2015/08/04 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python