`
smartzxy
  • 浏览: 196542 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

简单比较Python的数据持久化操作(二)

阅读更多

      Python中操作关系数据库最直接的就是用DB-API了,流程一般是:连接、执行SQL语句、提交、断开。以MySQL为例,下面是各步骤的代码示例:

 

首先是连接:

 

% python
>>> import MySQLdb
>>> conn = MySQLdb.connect(host='localhost', user='root', passwd='python')

 

接着便可以执行语句了,但在执行SQL语句前要先获取指针:

 

>>> curs = conn.cursor( )
>>> curs.execute('create database peopledb')
1L
>>> curs.execute('use peopledb')
0L
>>> tblcmd = 'create table people (name char(30), job char(10), pay int(4))'
>>> curs.execute(tblcmd)
0L

 

添加数据:

 

>>> curs.execute('insert people values (%s, %s, %s)', ('Bob', 'dev', 5000))
1L
>>> curs.executemany('insert people values (%s, %s, %s)',
...          [ ('Sue', 'mus', '70000'),
...            ('Ann', 'mus', '60000')])
2L
>>> conn.commit( )

 

执行查询:

 

>>> curs.execute('select * from people')
6L
>>> curs.fetchall( )
(('Bob', 'dev', 5000L), ('Sue', 'mus', 70000L), ('Ann', 'mus', 60000L), ('Tom',
'mgr', 100000L))

 

 

执行完数据库操作记得断开连接:

 

conn.close( )        # close, _ _del_ _ call rollback if changes not committed yet

 

 

      如果数据结构不是很复杂,配合Python强大的列表解析能力,不用ORM框架也是很方便的;或者自己封装对象映射也不是很难。


     如果使用了Django框架,可以使用它自带的ORM工具来操作数据库。首先当然是编写实体类(或者叫模型)了:

 

from django.db import models

class Musician(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

class Album(models.Model):
    artist = models.ForeignKey(Musician)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

 

 Python的代码已经很清楚了,类对应表,成员变量对应表的列,列属性由models.XXXField(...)定义。如果实体类没有显式定义主键,Django会默认加上一句:

 

id = models.AutoField(primary_key=True)

 

 Django里可以这样定义枚举型数据:

 

class Person(models.Model):
    GENDER_CHOICES = (
        (u'M', u'Male'),
        (u'F', u'Female'),
    )
    name = models.CharField(max_length=60)
    gender = models.CharField(max_length=2, choices=GENDER_CHOICES)

 

 对于关联关系,在做列的映射定义时可以这么写:

 

poll = models.ForeignKey(Poll)
sites = models.ManyToManyField(Site)
place = models.OneToOneField(Place")

 

 在Django里定义关联关系还有更多功能,详细的还是看官方文档吧~

      Django的Model基类中已经定义了基本的数据库操作,因为所有的实体类都是继承自Model类,所以也就有了这些操作。例如新建并保存一个person只需要这么做:

 

>>> p = Person(name="Fred Flinstone", gender="M")
>>> p.save()

 

 Django会通过查询对象的主键是否存在来决定该UPDATE还是INSERT,当然你也可以强制框架执行某种操作。如果你不满意框架自带的方法,可以重写它:

 

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        do_something()
        super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
        do_something_else()

 发现没,Django里存取数据不需要那种session,最讨厌Hibernate里的session了,总是报“Session Closed”错误……


      Python还有一个独立的ORM框架——SQLAlchemy。功能更强大,支持的数据库也比Django自带的ORM工具要多。它有两种建立实体类的方法。

      一种是分开定义,再将表定义和类定义映射起来。首先是建立表的定义:

>>> from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
>>> metadata = MetaData()
>>> users_table = Table('users', metadata,
...     Column('id', Integer, Sequence('user_id_seq'), primary_key=True),
...     Column('name', String(50)),
...     Column('fullname', String(50)),
...     Column('password', String(12))
... )

 接着定义实体类:

>>> class User(object):
...     def __init__(self, name, fullname, password):
...         self.name = name
...         self.fullname = fullname
...         self.password = password

 这还没完,还要把他们映射起来:

>>> from sqlalchemy.orm import mapper
>>> mapper(User, users_table) 

 这样的过程有点像Hibernate里将XML的Map文件和实体类的映射。Hibernate中还可以方便的直接用注释在实体类中完成与表的映射,当然SQLAlchemy也有直接的方法:

>>> from sqlalchemy.ext.declarative import declarative_base

>>> Base = declarative_base()
>>> class User(Base):
...     __tablename__ = 'users'
...
...     id = Column(Integer, primary_key=True)
...     name = Column(String)
...     fullname = Column(String)
...     password = Column(String)

 作为一个独立的ORM框架,实体类的存取当然就不会像Django那样集成的那么完美了,SQLAlchemy里存取数据也是要Session的:

>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)

 这里的engine对象需要这样建立:

>>> from sqlalchemy import create_engine
>>> engine = create_engine('dialect+driver://user:password@host/dbname[?key=value..]', echo=True)

 对于存取操作,如果是保存就这么写:

>>> ed_user = User('ed', 'Ed Jones', 'edspassword')
>>> session.add(ed_user)

 如果要查询,就是类似的这种形式:

>>> our_user = session.query(User).filter_by(name='ed').first() 

 执行完一些数据操作,必要的时候要提交或是回滚:

>>> session.rollback()
或者
>>> session.commit()

        SQLAlchemy框架还有一个衍生产品——Elixir,在SQLAlchemy的基础上对其映射方式做了些封装,使得实体类的定义有点类似Django中的定义方式。

      以上便是这两天对Python中数据存储的一些学习记录。话说Django的ORM与它的其他模块结合的很紧密,不好单独使用;SQLAlchemy虽然强大,但风格不太喜欢,所以下一步打算深入两个ORM框架的代码,看看他们是怎么实现的。一方面好抉择用哪一个,另外也可以看看在自己的应用中能否自己做一个简单的ORM。

分享到:
评论
5 楼 zzsczz 2010-10-12  
smalllixin 写道
规模大了,业务多了,写sql语句挺痛苦的



分析 设计  实现 测试 的 职责要分清楚。  你那个痛苦明显是管理问题

换个角度  规模大了  业务多了    收入也多阿
4 楼 smalllixin 2010-09-17  
规模大了,业务多了,写sql语句挺痛苦的
3 楼 ipconfiger 2010-09-05  
直接用SQL比较爽,多直接阿
2 楼 闲云无心 2010-08-13  
sqlobject给人一种不上不下的感觉,简单应用没django的方便,复杂应用又不如sqlalchemy远甚
1 楼 magic_yao 2010-08-13  
ORM,直接用SQLObject不就行了?

相关推荐

    Python拾趣013 数据持久化之HDF5数据操作

    HDF(Hierarchical Data Format)是一种设计用于存储和...Python也可以方便运用这个库,因为OpenCV的数据都是NumPy形式,操作也比较简单。 """ 有趣的事情 没有结束 2020/4/27 8:38 """ import numpy as np import cv2

    数据获取(Python爬虫)数据持久化(MySQL)Flask搭建Web后台数据可视化(H5+Echarts).zip

    它的界面简洁明了,操作简单易懂,即使是不熟悉电脑操作的人也可以轻松上手。同时,它还支持自定义快捷键和界面主题,可以让我们根据自己的习惯和喜好进行个性化设置。 此外,这款程序还具有出色的稳定性和安全性。...

    毕设&课设&项目&实训-提供了从爬虫获取数据到数据持久化、数据可视化分析以及构建简单的代理池等一整套解决方案模板。.zip

    基于webmagic + springboot + mybatis的Java爬虫,使用Echarts进行数据可视化分析,提供了从爬虫获取数据到数据持久化、数据可视化分析以及构建简单的代理池等一整套解决方案模板。 【项目资源】: 包含前端、后端、...

    2019千峰Python超详细入门教程(百度云盘分享).docx

    │ │ 5、Python数据类型.py │ │ 6、标识符.py │ │ 7、变量与常量.py │ │ │ ├─file │ │ │ MindManager_64bit_17.2.208.exe │ │ │ Python安装.pdf │ │ │ Python概述.pdf │ │ │ submit 2.0.rar ...

    python web开发学习实录

    内容包括 Python 的安装和环境配置、Python的基本语法、流程控制、模块和函数、数据结构、字符串与正则表达式、面向对象编程、文件处理、程序异常和处理、数据库连接和持久化操作、Python网络功能、Python与HTML、...

    Python核心编程第二版

     6.4.1 格式化操作符(%)   6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/R)   6.4.4 Unicode字符串操作符(u/U)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型...

    Python核心编程第二版(ok)

     6.4.1 格式化操作符(%)   6.4.2 字符串模板c更简单的替代品   6.4.3 原始字符串操作符(rR)   6.4.4 Unicode字符串操作符(uU)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型...

    Python编程入门经典

    21.2 比较各种Python实现 461 21.3 安装Jython 461 21.4 运行Jython 461 21.4.1 交互地运行Jython 461 21.4.2 运行Jython脚本 463 21.4.3 控制jython脚本 463 21.4.4 创建可执行命令 464 21.5 独立运行Jython 465 ...

    像计算机科学家一样思考Python(第2版).pdf

    14.1 持久化 144 14.2 读和写 144 14.3 格式操作符 145 14.4 文件名和路径 146 14.5 捕获异常 147 14.6 数据库 148 14.7 封存 149 14.8 管道 150 14.9 编写模块 151 14.10 调试 152 14.11 术语...

    python入门到高级全栈工程师培训 第3期 附课件代码

    python入门到高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看后24小时之内删除。 【课程内容】 第1章 01 计算机发展史 02 计算机系统 03 小结 04 数据的概念 05 进制转换 06 原码补码反码 07 物理层和...

    Python酒店管理系统 课程设计

    这段Python代码实现了一个简单的酒店管理系统,允许用户执行多种操作,包括添加、删除、修改、查询房间信息以及数据统计分析。该系统使用JSON文件进行数据持久化存储,并提供一个文本界面供用户选择不同的操作。

    Python Cookbook

    第7章 持久化和数据库 273 引言 273 7.1 使用marshal模块序列化数据 275 7.2 使用pickle和cPickle模块序列化数据 277 7.3 在Pickling的时候压缩 280 7.4 对类和实例使用cPickle模块 281 7.5 Pickling被绑定...

    Python餐厅管理系统 课程设计

    3. 数据持久化: - 通过将食材信息保存到JSON文件中,系统确保数据的持久性和一致性。这对于记录长期数据或在不同会话间维持数据状态非常重要。 4.用户交互: - 系统通过一个简单的命令行界面与用户交互,用户可以...

    Redis特性和应用场景

    持久化 由于所有数据保持在内存中,所以对数据的更新将异步地保存到磁盘上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。数据超过内存,使用swap,保证数据; memcacache不能持久化,mongo是部分在内存...

    大数据爬虫技术第9章 存储爬虫数据.ppt

    01 数据存储简介 02 MongoDB数据库简介 03 使用PyMongo库存储到数据库 MongoDB是一款基于分布式文件存储的NoSQL数据库,具有免费、操作简单、面向文档存储等强大特点,旨在为Web应用提供可扩展的高性能数据存储解决...

    redis2加强.doc

    5〉持久化:发生断电或机器故障,数据可能会丢失,持久化到硬盘 6〉主从复制:实现多个相同数据的 redis 副本 8〉高可用和分布式:哨兵机制实现高可用,保证 redis 节点故障发现和自动转移 9〉客户端语言多:java ...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    python数据类型 bytes数据类型 列表的使用 元组与购物车程序练习 购物车程序练习实例 字符串常用操作 字典的使用 三级菜单实例 本周作业-购物车优化 第3周 作业 上节内容回顾 集合及其运算 文件读与写详解 心灵...

    micmat:MICMat 是 Intel Xeon Phi 的 Python 接口

    控制主机和MIC之间的数据传输非常简单,并且完全支持数据持久化。 自动内存管理:MICMat 提供自动垃圾收集:它与 Python 垃圾收集例程兼容。 然而,它还提供了显式的内存管理和重用,从而避免了昂贵的内存分配和...

    SQLAlchemy - Python的SQL工具包和对象关系映射器-python

    这些模式允许使用声明性配置系统透明地持久化对象。 可以自然地构建和操作领域模型,并且更改自动与当前事务同步。 一个面向关系的查询系统,根据对象模型,显式地公开 SQL 的全部功能,包括连接、子查询、关联和...

    自美智能系统是基于树莓派、Python、HTML5、PHP、微信小程序打造出的一款物联网人工智能系统.zip

    PHP提供mysqli、PDO等数据库扩展,能够无缝连接MySQL,进行SQL查询、数据插入、更新、删除等操作,实现动态网站的数据持久化。此外,PHP还支持与其他数据库系统的连接,如PostgreSQL、SQLite、Oracle等,具有良好的...

Global site tag (gtag.js) - Google Analytics