Python对于数据库的管理操作大体可以分为两种方式,一是直接操作数据库,Python仅仅提供一个数据库接口,开发者需要直接和数据库打交道来获取数据;第二种是ORM模式(对象关系映射object-relational mapper),下面会详细介绍。

1. 直接型数据库操作

这种方式是一种直接的数据库操作方式(和其他许多语言都类似),由Python数据库连接模块提供对数据库的连接、查询、修改等接口,这类模块包括MySQLdb、cx_Oracle等,下面介绍下Mysql的使用,其他类型的数据库操作也是类似的。

演示一下插入数据,批量插入数据,更新数据的例子

1. import MySQLdb
2.  
3. try:
4.     conn=MySQLdb.connect(host='localhost',user='root',passwd='root',port=3306)
5.     cur=conn.cursor()
6.      
7.     cur.execute('create database if not exists python')
8.     conn.select_db('python')
9.     cur.execute('create table test(id int,info varchar(20))')
10.      
11.     value=[1,'hi rollen']
12.     cur.execute('insert into test values(%s,%s)',value)
13.      
14.     values=[]
15.     for i in range(20):
16.         values.append((i,'hi rollen'+str(i)))
17.          
18.     cur.executemany('insert into test values(%s,%s)',values)
19.     cur.execute('update test set info="I am rollen" where id=3')
20.  
21.     conn.commit()
22.     cur.close()
23.     conn.close()
24.  
25. except MySQLdb.Error,e:
26.      print "Mysql Error %d: %s" % (e.args[0], e.args[1])

然后查询数据

1. import MySQLdb
2.  
3. try:
4.     conn=MySQLdb.connect(host='localhost',user='root',passwd='root',port=3306)
5.     cur=conn.cursor()
6.      
7.     conn.select_db('python')
8.     count=cur.execute('select * from test')
9.     print 'there has %s rows record' % count
10.  
11.     result=cur.fetchone()
12.     print result
13.     print 'ID: %s info %s' % result
14.  
15.     results=cur.fetchmany(5)
16.     for r in results:
17.         print r
18.  
19.     print '=='*10
20.     cur.scroll(0,mode='absolute')
21.  
22.     results=cur.fetchall()
23.     for r in results:
24.         print r[1]
25.      
26.     conn.commit()
27.     cur.close()
28.     conn.close()
29.  
30. except MySQLdb.Error,e:
31.      print "Mysql Error %d: %s" % (e.args[0], e.args[1])

请注意一定要有conn.commit()这句来提交事务,要不然不能真正的插入数据。
常用的函数:

  1. commit() 提交
  2. rollback() 回滚

  3. cursor用来执行命令的方法:
  4. callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
  5. execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
  6. executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
  7. nextset(self):移动到下一个结果集

  8. cursor用来接收返回值的方法:
  9. fetchall(self):接收全部的返回结果行.
  10. fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
  11. fetchone(self):返回一条结果行.
  12. scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.

如果出现了乱码,可以尝试以下方法:

conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python') 中加一个属性:
 改为:
conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python',charset='utf8')


charset是要跟你数据库的编码一样,如果是数据库是gb2312 ,则写charset='gb2312'。

2 ORM模式

Python中提供ORM支持的项目不止一个,知道的就有Django 以及 Storm。这两个项目的应用领域稍有区别,但是数据库操作的理论原理是相同的。ORM在开发者和数据库之间建立了一个中间层,把数据库中的数据转换成了Python中的对象实体,这样既屏蔽了不同数据库之间的差异性,又使开发者可以非常方便的操作数据库中的数据,而且可以使用面向对象的高级特性。

2.1 Django 

Django 是基于 Python 的 Web 应用程序框架,最初旨在简化数据库驱动的、面向新闻的 Web 应用程序的开发。其后,它已经发展成功能完备的 Web 框架,经常用来简化数据库支持的复杂 Web 应用程序的开发。
Django 的对象关系映射器 (ORM) 位于框架的中心,介于数据模型(您在 django.db.models.Model 类之上构建的 Python 类)和基础关系数据库对象之间。定义数据模型之后,您将能够通过映射到基础数据库中的对象的 Python 对象,来创建、检索、更新以及删除数据库数据。需要强调的是,除了 PostgreSQL、MySQL 和 SQLite 之外,Django 还正式支持 Oracle 数据库,可让您使用 ORM 特性访问和操作 Oracle 数据库数据。

大多数情况下,应用的创建至少需要执行以下五个步骤:

  1. 在 settings.py 中指定数据库信息
  2. 创建模型
  3. 创建模板
  4. 创建视图
  5. 在 urls.py 中配置 URL 模式

在继续上述步骤之前,让我们看一下 Django 应用程序的高级视图,以便您可以更好地了解 Django 中的组件如何工作。下图示意性地显示了 Django 应用程序如何工作以满足用户请求。

python 数据库监控工具 python 数据库管理_数据库


根据此图中的图示,工作方式如下:

  1. 用户输入支持 Django 的站点的 URL 或在此站点的已加载页面上执行操作,从而将请求发送到托管此站点的 Web 服务器。
  2. Django 的 URL 调度程序遍历 urls.py 文件中的 URL 模式,并选择第一个与用户请求的 URL 匹配的模式,然后调用与所发现模式相关联的视图(Python 回调函数)。
  3. 视图使用数据模型获得数据库数据,然后加载指定模板(已嵌入特殊模板标记的 HTML 页面;它类似于 Java 中的 JavaServer Page),并向其传递上下文(包括映射到模板变量名称的已获得数据)。
  4. 最后,视图返回由已呈现模板填充的 HttpResponse 对象,如果出现错误,则返回 HTTP 异常。

您可以看到,Django 基于将 Web 应用程序逻辑分为模型、视图和模板的概念,因此有效地将业务逻辑和展示分离开来。通常,这类似于当今许多其他 Web 框架中使用的模型-视图-控制器 (MVC) 范例。然而,在 Django 中,视图更像控制器,介于模型和模板之间。而 Django 模板更接近于 MVC 视图,因为这些模板负责使用从模型中获得的数据生成适当的用户界面。

将 Django 用于 Apache
Django 的内置开发 Web 服务器仅适用于测试,这意味着它并不是生产服务器。如果要将它用于生产,您需要慎重考虑。
您可以通过 mod_python 模块(用于在 Apache 内嵌入 Python)将 Django 部署到 Apache。因此,首先确保您已将 mod_python 模块安装到 Apache 服务器上(可以在 此处找到详细信息)。然后,您可以将以下 Location 块添加到 Apache 的 httpd.conf 配置文件中(在 PythonPath 中使用实际路径):

1. < Location "/myapp/">
2.     SetHandler python-program
3.     PythonPath "['/home/user/myprojects', '/home/user/myprojects/myproj'] + sys.path"
4.     PythonHandler django.core.handlers.modpython
5.     SetEnv DJANGO_SETTINGS_MODULE myproj.settings
6.     PythonDebug On
7. < /Location>

详细配置和使用方法可以参考http://www.oracle.com/technetwork/cn/articles/vasiliev-django-100817-zhs.html http://www.ibm.com/developerworks/cn/linux/l-django/ https://www.djangoproject.com/

2.2 Storm

与Django不同,Storm 是一个专门的 Python ORM 库,它的使用相对Django 要简单一些。

载入

>>> from storm.locals import *
>>>



基本定义
现在,我们定义一种用几项属性来描述信息的类型(type),用它来作映射。

>>> class Person(object):
...     __storm_table__ = "person"
...     id = Int(primary=True)
...     name = Unicode()


注意,这个定义没有使用任何 Storm 定义的 base 类或构造函数。

创建一个数据库以及仓库(store)
我们还是什么都没讲到,因此,让我们来定义一个储存在内存中的 SQLite 数据库,以及使用该数据库的仓库来玩玩。

>>> database = create_database("sqlite:")
>>> store = Store(database)
>>>


目前,有三种数据库被支持: SQLite , MySQL 以及 PostgreSQL 。 create_database 函数接受 URI 作为参数,就像这样:

database = create_database("scheme://username:password@hostname:port/database_name")


其中的 scheme 可以是 sqlite , postgres ,或 mysql 。

现在我们要创建一个表,将该表用来保存我们类中的数据。

>>> store.execute("CREATE TABLE person "
...               "(id INTEGER PRIMARY KEY, name VARCHAR)")
>


我们得到了一个结果(result),不过现在不必关心它。通过使用 noresult=True ,我们也可以省略所有结果。

创建对象
让我们通过前面定义的类来创建对象。

>>> joe = Person()
>>> joe.name = u"Joe Johnes"
>>>
>>> print "%r, %r" % (joe.id, joe.name)
5 None, u'Joe Johnes'



到目前为止,这个对象都还没有连接到数据库。现在,让我们将它加入到前面创建的仓库当中。

>>> store.add(joe)

>>> print "%r, %r" % (joe.id, joe.name)
None, u'Joe Johnes'


请注意,这个对象并没有任何改变,即便是被加入到仓库之后 —— 这是因为它还没有刷新呢。

对象的仓库
一旦对象被加入到仓库,或从仓库中被检索,它和仓库的关系就明了了。我们也可以很容易地验证对象绑定到了哪一个仓库。

>>> Store.of(joe) is store
True
>>> Store.of(Person()) is None
True



对象的查找
现在,如果我们向仓库查询名为 Joe Johnes 的人,会发生什么事?

>>> person = store.find(Person, Person.name == u"Joe Johnes").one()
>>> print "%r, %r" % (person.id, person.name)
1, u'Joe Johnes'


Joe Johnes 已经被仓库记录了!是的,就正如你所期待的一样。

我们还可以通过主键(primary key)来检索对象。

>>> store.get(Person, 1).name
u'Joe Johnes



详细信息参考:https://strom-orm-tutorial.readthedocs.org/en/latest/ https://storm.canonical.com/Tutorial