擅长:python、mysql、java
<p>这个例子有很多问题。我会的
一个接一个地说。</p>
<ul>
<li>没有错误检查。我们要么使用try/except/finally
构造或使用带</strong>关键字的<strong>。</li>
<li>Python方法不像C#属性。您没有运行<code>execute()</code>方法,而是将一些字符串赋给一个对象。(在Python中,方法也是对象。)</li>
<li>非常重要的是,您的代码会受到SQL注入攻击。我们不应该使用Python字符串操作构建SQL语句。我们应该始终使用占位符。</li>
<li>这个例子是不完整的。这就引出了一个棘手的问题。假设存在一个<code>CREATE TABLE</code>语句,那么将创建一个新的<strong>隐式事务</strong>。必须发出<code>commit()</code>语句才能将数据保存到数据库文件中。在SQLite中,除了<code>SELECT</code>之外的任何语句都会启动隐式事务。(某些数据库,如MySQL,默认情况下处于自动提交模式。这对于SQLite是不正确的。)</li>
</ul>
<p>下面是一个正确的工作示例,它将把LibreOffice文档写入文档
SQLite数据库的表:</p>
<pre><code>#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
fl = open('book.odt', 'rb')
with fl:
data = fl.read()
con = lite.connect('test.db')
with con:
cur = con.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS Docs(Data BLOB)")
sql = "INSERT INTO Docs(Data) VALUES (?)"
cur.execute(sql, (lite.Binary(data), ))
</code></pre>
<p>book.odt文件位于当前工作目录中。我们没有手动调用commit()方法,因为这是由with关键字在幕后处理的。</p>