`
smartzxy
  • 浏览: 200492 次
  • 性别: 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持久化操作

    ### Python 持久化操作——CSV、Excel篇 #### 1. Python中读写CSV文件 ##### 1.1 什么是CSV CSV (Comma-Sparated Values),即逗号分隔值,是一种通用的、相对简单的文件格式,被用户、商业和科学界广泛采用。CSV...

    Python数据持久化shelve模块用法分析

    shelve模块是Python的一个...希望通过以上的详细分析,能够帮助你更好地理解和掌握Python数据持久化shelve模块的用法。更多关于Python的知识和技巧,可以进一步参考相关的教程和专题文章,从而提升你的Python编程能力。

    Python3.7.2中文文档-标准库-Python数据持久性

    Python3.7.2中文文档中的“Python数据持久性”章节是关于如何在程序运行间保存和恢复数据的重要部分。这一部分主要涵盖了Python如何利用各种数据存储机制来确保数据的长期存在,即使在程序关闭后也能保留。这些机制...

    python序列化与数据持久化实例详解

    从上面的代码可以看出,使用shelve模块进行数据持久化操作非常简单,这使得它在需要持久化存储Python对象而又不需要复杂查询功能时非常有用。 除了shelve,Python标准库中还包括dbm模块,它提供了类似的功能,但...

    Python-所有ApolloClient20cache实现的简单持久化

    本文将深入探讨标题中的"Python-所有ApolloClient20cache实现的简单持久化",以及与之相关的标签"Python开发-数据缓存"。 Apollo是一个配置中心,它允许应用程序动态地获取和更新配置,而无需重启服务。在Python中...

    python文件和数据格式化.ppt

    文件是数据持久化的基础,它们可以存储文本、二进制数据或者其他各种类型的信息。本章主要介绍了Python中文件的基本操作和数据格式化的概念。 首先,文件分为两类:文本文件和二进制文件。文本文件通常使用统一的...

    python3内置持久化模块shelve心得

    Python 提供了多种方式来实现数据的持久化,其中 `shelve` 模块是一个非常实用的选择,它允许我们像使用字典一样来存储复杂的数据结构,并将其保存到磁盘上以便后续使用。 #### shelve 模块详解 `shelve` 模块基于...

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

    本文将重点讨论HDF5这种高效的数据持久化方法,特别是针对Python的HDF5数据操作。 HDF5(Hierarchical Data Format 5)是一种开源文件格式,最初由美国国家超算中心研发,现由HDF Group维护。它的设计目标是处理...

    python3内置持久化模块pickle心得

    通过`pickle`,我们可以将Python中的各种数据结构(如列表、字典、元组等)转换成一个字节流(bytes),这样就可以方便地在网络上传输或者存储到硬盘上,从而实现数据的持久化存储。 #### 二、pickle模块的基本功能...

    二级Python题库.zip

    9. **文件操作**:Python能方便地读写文件,如打开、关闭、读取、写入等,这对于数据处理和持久化存储非常重要。 10. **面向对象编程**:Python支持类和对象的概念,可以创建自定义类,实现继承、封装和多态。 11....

    python程序设计教程-张莉-江苏省python二级教材-全套PPT

    这在处理大量数据或持久化数据时非常关键。 第8章《面向对象程序设计》深入介绍了面向对象编程的基本概念,如类、对象、继承、多态,这是Python中实现复杂逻辑和代码复用的重要方式。 第10章《图形用户界面开发》...

    Python实现简易图书管理系统

    Python有内置的csv模块,可以方便地读取和写入这类文件,用于系统中图书数据的持久化存储。 接下来,"untitled.py"应该是项目的主程序文件。在这个文件中,开发者可能使用了Python的Tkinter库来创建GUI界面。...

    Python数据分析的学习代码.zip

    Pandas支持多种数据格式的读写,如CSV、Excel、SQL数据库等,方便数据的导入导出和持久化。 综上所述,Python数据分析涉及到的数据处理、数据清洗、可视化和机器学习等多个方面,通过熟练掌握这些工具和技巧,可以...

    Python 学习笔记 第二版.pdf

    - **数据存储**:标准库中的`pickle`和`shelve`模块提供了序列化和反序列化的功能,可用于持久化存储数据。 - **数据压缩**:`gzip`和`zipfile`等模块提供了压缩和解压数据的功能。 - **格式解析**:标准库中的`...

    python 基础教程 Hetland 第二版 源代码

    这在实际项目中非常常见,例如日志记录、数据持久化等。 7. 错误与异常处理:通过try-except语句,Python允许我们优雅地处理程序运行时可能出现的错误,确保程序的健壮性。 8. 标准库和第三方库:Python的标准库...

    python简单的银行管理系统

    3. **数据库接口**:为了持久化存储用户数据,通常会使用数据库。Python的标准库`sqlite3`可以让我们方便地与SQLite数据库交互。需要掌握如何创建数据库、表,执行SQL查询(如INSERT、SELECT、UPDATE、DELETE),...

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

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

    用Python玩转数据_python教程_爬虫_数据处理_

    Scrapy则是一个完整的爬虫框架,支持多线程、中间件处理和数据持久化,适用于大规模的Web抓取任务。 数据清洗是数据分析的关键步骤,Python的Pandas库提供了大量的函数,如dropna()用于去除缺失值,fillna()用于...

    Python操作MySQL数据.pdf

    `commit()`方法用来提交事务,确保数据被持久化。`rowcount`属性则可以告诉我们受影响的行数,即插入了多少条记录。 在完成所有数据库操作后,记得关闭连接以释放资源: ```python mydb.close() ``` 这只是一个...

Global site tag (gtag.js) - Google Analytics