SQLite 数据库

SQLite 是一个小型的关系型数据库,它最大的特点在于不需要服务器、零配置。在前面的两个服务器,不管是 MySQL 还是 MongoDB,都需要“安装”,安装之后,它运行起来,其实是已经有一个相应的服务器在跑着呢。而 SQLite 不需要这样,首先 Python 已经将相应的驱动模块作为标准库一部分了,只要安装了 Python,就可以使用;另外,它也不需要服务器,可以类似操作文件那样来操作 SQLite 数据库文件。还有一点也不错,SQLite 源代码不受版权限制。

SQLite 也是一个关系型数据库,所以 SQL 语句,都可以在里面使用。

跟操作 mysql 数据库类似,对于 SQLite 数据库,也要通过以下几步:

  • 建立连接对象
  • 连接对象方法:建立游标对象
  • 游标对象方法:执行 sql 语句

建立连接对象

由于 SQLite 数据库的驱动已经在 Python 里面了,所以,只要引用就可以直接使用

  1. >>> import sqlite3
  2. >>> conn = sqlite3.connect("23301.db")

这样就得到了连接对象,是不是比 mysql 连接要简化了很多呢。在 sqlite3.connect("23301.db") 语句中,如果已经有了那个数据库,就连接上它;如果没有,就新建一个。注意,这里的路径可以随意指定的。

不妨到目录中看一看,是否存在了刚才建立的数据库文件。

  1. /2code$ ls 23301.db
  2. 23301.db

果然有了一个文件。

连接对象建立起来之后,就要使用连接对象的方法继续工作了。

  1. >>> dir(conn)
  2. ['DataError', 'DatabaseError', 'Error', 'IntegrityError', 'InterfaceError', 'InternalError', 'NotSupportedError', 'OperationalError', 'ProgrammingError', 'Warning', '__call__', '__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'commit', 'create_aggregate', 'create_collation', 'create_function', 'cursor', 'enable_load_extension', 'execute', 'executemany', 'executescript', 'interrupt', 'isolation_level', 'iterdump', 'load_extension', 'rollback', 'row_factory', 'set_authorizer', 'set_progress_handler', 'text_factory', 'total_changes']

游标对象

这步跟 mysql 也类似,要建立游标对象。

  1. >>> cur = conn.cursor()

接下来对数据库内容的操作,都是用游标对象方法来实现了:

  1. >>> dir(cur)
  2. ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'arraysize', 'close', 'connection', 'description', 'execute', 'executemany', 'executescript', 'fetchall', 'fetchmany', 'fetchone', 'lastrowid', 'next', 'row_factory', 'rowcount', 'setinputsizes', 'setoutputsize']

是不是看到熟悉的名称了:close(), execute(), executemany(), fetchall()

创建数据库表

在 mysql 中,我们演示的是利用 mysql 的 shell 来创建的表。其实,当然可以使用 sql 语句,在 Python 中实现这个功能。这里对 sqlite 数据库,就如此操作一番。

  1. >>> create_table = "create table books (title text, author text, lang text) "
  2. >>> cur.execute(create_table)
  3. <sqlite3.Cursor object at 0xb73ed5a0>

这样就在数据库 23301.db 中建立了一个表 books。对这个表可以增加数据了:

  1. >>> cur.execute('insert into books values ("from beginner to master", "laoqi", "python")')
  2. <sqlite3.Cursor object at 0xb73ed5a0>

为了保证数据能够保存,还要(这是多么熟悉的操作流程和命令呀):

  1. >>> conn.commit()
  2. >>> cur.close()
  3. >>> conn.close()

支持,刚才建立的那个数据库中,已经有了一个表 books,表中已经有了一条记录。

整个流程都不陌生。

查询

存进去了,总要看看,这算强迫症吗?

  1. >>> conn = sqlite3.connect("23301.db")
  2. >>> cur = conn.cursor()
  3. >>> cur.execute('select * from books')
  4. <sqlite3.Cursor object at 0xb73edea0>
  5. >>> print cur.fetchall()
  6. [(u'from beginner to master', u'laoqi', u'python')]

批量插入

多增加点内容,以便于做别的操作:

  1. >>> books = [("first book","first","c"), ("second book","second","c"), ("third book","second","python")]

这回来一个批量插入

  1. >>> cur.executemany('insert into books values (?,?,?)', books)
  2. <sqlite3.Cursor object at 0xb73edea0>
  3. >>> conn.commit()

用循环语句打印一下查询结果:

  1. >>> rows = cur.execute('select * from books')
  2. >>> for row in rows:
  3. ... print row
  4. ...
  5. (u'from beginner to master', u'laoqi', u'python')
  6. (u'first book', u'first', u'c')
  7. (u'second book', u'second', u'c')
  8. (u'third book', u'second', u'python')

更新

正如前面所说,在 cur.execute() 中,你可以写 SQL 语句,来操作数据库。

  1. >>> cur.execute("update books set title='physics' where author='first'")
  2. <sqlite3.Cursor object at 0xb73edea0>
  3. >>> conn.commit()

按照条件查处来看一看:

  1. >>> cur.execute("select * from books where author='first'")
  2. <sqlite3.Cursor object at 0xb73edea0>
  3. >>> cur.fetchone()
  4. (u'physics', u'first', u'c')

删除

在 sql 语句中,这也是常用的。

  1. >>> cur.execute("delete from books where author='second'")
  2. <sqlite3.Cursor object at 0xb73edea0>
  3. >>> conn.commit()
  4. >>> cur.execute("select * from books")
  5. <sqlite3.Cursor object at 0xb73edea0>
  6. >>> cur.fetchall()
  7. [(u'from beginner to master', u'laoqi', u'python'), (u'physics', u'first', u'c')]

不要忘记,在你完成对数据库的操作是,一定要关门才能走人:

  1. >>> cur.close()
  2. >>> conn.close()

作为基本知识,已经介绍差不多了。当然,在实践的编程中,或许会遇到问题,就请读者多参考官方文档:https://docs.Python.org/2/library/sqlite3.html


总目录

如果你认为有必要打赏我,请通过支付宝:qiwsir@126.com,不胜感激。