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 相关文章推荐
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
在centos7中分布式部署pyspider
May 03 Python
python 自动去除空行的实例
Jul 24 Python
python文件选择对话框的操作方法
Jun 27 Python
Python3内置模块random随机方法小结
Jul 13 Python
python的pstuil模块使用方法总结
Jul 26 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
Python Websocket服务端通信的使用示例
Feb 25 Python
python新手学习使用库
Jun 11 Python
如何清空python的变量
Jul 05 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
10张动图学会python循环与递归问题
Feb 06 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
用PHP实现多级树型菜单
2006/10/09 PHP
一步一步学习PHP(3) php 函数
2010/02/15 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
python生成器generator用法实例分析
2015/06/04 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
Python绘图实现显示中文
2019/12/04 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
成龙洗发水广告词
2014/03/14 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
安全保证书怎么写
2015/02/28 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL