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导入模块时遇到的错误分析
Aug 30 Python
python3库numpy数组属性的查看方法
Apr 17 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
python实现多人聊天室
Mar 31 Python
python3.6使用pickle序列化class的方法
Oct 22 Python
对python 生成拼接xml报文的示例详解
Dec 28 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
python装饰器练习题及答案
Nov 01 Python
基于python读取.mat文件并取出信息
Dec 16 Python
Python运行DLL文件的方法
Jan 17 Python
Django 5种类型Session使用方法解析
Apr 29 Python
Python实现一个优先级队列的方法
Jul 31 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 include的妙用,实现路径加密
2008/07/29 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
JS实现百度搜索框
2021/02/25 Javascript
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
Python 中Pickle库的使用详解
2018/02/24 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
高中毕业自我鉴定
2013/12/22 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
2015年国培研修感言
2015/08/01 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python
详解Vue的sync修饰符
2021/05/15 Vue.js