SQL 数据库¶

Python 提供了一系列标准的数据库的 API,这里我们介绍 sqlite 数据库的用法,其他的数据库的用法大同小异:

In [1]:

  1. import sqlite3 as db

首先我们要建立或者连接到一个数据库上:

In [2]:

  1. connection = db.connect("my_database.sqlite")

不同的数据库有着不同的连接方法,例如 cx-oracle 数据库的链接方式为:

  1. connection = db.connect(username, password, host, port, 'XE')

一旦建立连接,我们可以利用它的 cursor() 来执行 SQL 语句:

In [3]:

  1. cursor = connection.cursor()
  2. cursor.execute("""CREATE TABLE IF NOT EXISTS orders(
  3. order_id TEXT PRIMARY KEY,
  4. date TEXT,
  5. symbol TEXT,
  6. quantity INTEGER,
  7. price NUMBER)""")
  8. cursor.execute("""INSERT INTO orders VALUES
  9. ('A0001', '2013-12-01', 'AAPL', 1000, 203.4)""")
  10. connection.commit()

不过为了安全起见,一般不将数据内容写入字符串再传入,而是使用这样的方式:

In [4]:

  1. orders = [
  2. ("A0002","2013-12-01","MSFT",1500,167.5),
  3. ("A0003","2013-12-02","GOOG",1500,167.5)
  4. ]
  5. cursor.executemany("""INSERT INTO orders VALUES
  6. (?, ?, ?, ?, ?)""", orders)
  7. connection.commit()

cx-oracle 数据库使用不同的方式:

  1. cursor.executemany("""INSERT INTO orders VALUES
  2. (:order_id, :date, :symbol, :quantity, :price)""",
  3. orders)

查看支持的数据库格式:

In [5]:

  1. db.paramstyle

Out[5]:

  1. 'qmark'

query 语句执行之后,我们需要进行 commit,否则数据库将不会接受这些变化,如果想撤销某个 commit,可以使用 rollback() 方法撤销到上一次 commit() 的结果:

  1. try:
  2. ... # perform some operations
  3. except:
  4. connection.rollback()
  5. raise
  6. else:
  7. connection.commit()

使用 SELECT 语句对数据库进行查询:

In [6]:

  1. stock = 'MSFT'
  2. cursor.execute("""SELECT *
  3. FROM orders
  4. WHERE symbol=?
  5. ORDER BY quantity""", (stock,))
  6. for row in cursor:
  7. print row
  1. (u'A0002', u'2013-12-01', u'MSFT', 1500, 167.5)

cursor.fetchone() 返回下一条内容, cursor.fetchall() 返回所有查询到的内容组成的列表(可能非常大):

In [7]:

  1. stock = 'AAPL'
  2. cursor.execute("""SELECT *
  3. FROM orders
  4. WHERE symbol=?
  5. ORDER BY quantity""", (stock,))
  6. cursor.fetchall()

Out[7]:

  1. [(u'A0001', u'2013-12-01', u'AAPL', 1000, 203.4)]

关闭数据库:

In [8]:

  1. cursor.close()
  2. connection.close()

原文: https://nbviewer.jupyter.org/github/lijin-THU/notes-python/blob/master/05-advanced-python/05.06-sql-databases.ipynb