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 + openpyxl处理excel2007文档思路以及心得
Jul 14 Python
python with statement 进行文件操作指南
Aug 22 Python
python错误处理详解
Sep 28 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
PyQt5固定窗口大小的方法
Jun 18 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
使用python的pyplot绘制函数实例
Feb 13 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 Python
利用python做数据拟合详情
Nov 17 Python
Python可视化学习之seaborn调色盘
Feb 24 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 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
事件模型在各浏览器中存在差异
2010/10/20 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
举例讲解Python中is和id的用法
2015/04/03 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
多版本Python共存的配置方法
2017/05/22 Python
聊聊Python中的pypy
2018/01/12 Python
ipython和python区别详解
2019/06/26 Python
python里glob模块知识点总结
2021/01/05 Python
C语言面试题
2013/05/19 面试题
后勤人员自我鉴定
2013/10/20 职场文书
基层工作经历证明
2014/01/13 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
党员活动总结
2015/02/04 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
红色经典观后感
2015/06/18 职场文书
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技