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中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 Python
python多线程threading.Lock锁用法实例
Nov 01 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
老生常谈Python进阶之装饰器
May 11 Python
python修改txt文件中的某一项方法
Dec 29 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 Python
手动安装python3.6的操作过程详解
Jan 13 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Python编写单元测试代码实例
Sep 10 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和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
cssQuery()的下载与使用方法
2007/01/12 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
js实现文字滚动效果
2016/03/03 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
js实现楼层导航功能
2017/02/23 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
Python中str is not callable问题详解及解决办法
2017/02/10 Python
Android分包MultiDex策略详解
2017/10/30 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
详解Python中的type和object
2018/08/15 Python
在python中用url_for构造URL的方法
2019/07/25 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
python机器学习库xgboost的使用
2020/01/20 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
用python进行视频剪辑
2020/11/02 Python
python爬虫请求头的使用
2020/12/01 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书