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 21 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
python实现括号匹配的思路详解
Aug 23 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
python使用MQTT给硬件传输图片的实现方法
May 05 Python
python实现在一个画布上画多个子图
Jan 19 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
如何理解python面向对象编程
Jun 01 Python
Python爬虫与反爬虫大战
Jul 30 Python
python爬取微博评论的实例讲解
Jan 15 Python
使用scrapy实现增量式爬取方式
Jun 21 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
BBS(php &amp; mysql)完整版(七)
2006/10/09 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python正则分析nginx的访问日志
2017/01/17 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
Python socket服务常用操作代码实例
2020/06/22 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
捐款倡议书怎么写
2014/05/13 职场文书
小区文明倡议书
2014/05/16 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
SQL Server内存机制浅探
2022/04/06 SQL Server