我在Python中使用SQLite有一个简单的数据库应用程序。我写了一个简单的程序来创建数据库并插入一些值。但是,已创建数据库,但未插入新值,我不知道原因:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
import sys
def CreateTable():
try:
connection = lite.connect(':memory:')
with connection:
cursor = connection.cursor()
sql = 'CREATE TABLE IF NOT EXISTS Authors' + '(ID INT PRIMARY KEY NOT NULL, FIRSTNAME TEXT, LASTNAME TEXT, EMAIL TEXT)'
cursor.execute(sql)
data = '\n'.join(connection.iterdump())
with open('authors.sql', 'w') as f:
f.write(data)
except lite.Error, e:
if connection:
connection.rollback()
finally:
if connection:
cursor.close()
connection.close()
def Insert(firstname, lastname, email) :
try:
connection = lite.connect('authors.sql')
with connection:
cursor = connection.cursor()
sql = "INSERT INTO Authors VALUES (NULL, %s, %s, %s)" % (firstname, lastname, email)
cursor.execute(sql)
data = '\n'.join(connection.iterdump())
with open('authors.sql', 'w') as f:
f.write(data)
except lite.Error, e:
if connection:
connection.rollback()
finally:
if connection:
cursor.close()
connection.close()
CreateTable()
Insert('Tibby', 'Molko', 'tibby.molko@yahoo.co.uk')
答案 0 :(得分:1)
您无法使用sql命令连接到文本文件。
sqlite3.connect
期望或创建二进制文件。
答案 1 :(得分:1)
您误解了的connection.iterdump()
。您正在创建 SQL文本,以便SQLite在以后再次执行。它不是数据库本身。如果您只想输出SQL语句,您可以直接编写SQL语句,那么首先将它传递给SQLite是没有意义的。
你也无法连接' SQLite到SQL语句的文本文件;您必须将这些语句作为文本加载并重新播放。但这不是我想你想要的。
您可以连接到现有数据库以插入其他行。每次要添加数据时,只需连接:
def CreateTable():
connection = lite.connect('authors.db')
try:
with connection as:
cursor = connection.cursor()
sql = '''\
CREATE TABLE IF NOT EXISTS Authors (
ID INT PRIMARY KEY NOT NULL,
FIRSTNAME TEXT,
LASTNAME TEXT,
EMAIL TEXT)
'''
cursor.execute(sql)
finally:
connection.close()
def Insert(firstname, lastname, email) :
connection = lite.connect('authors.db')
try:
with connection:
cursor = connection.cursor()
sql = "INSERT INTO Authors VALUES (NULL, ?, ?, ?)"
cursor.execute(sql, (firstname, lastname, email))
finally:
connection.close()
请注意,将连接用作上下文管理器已确保事务已提交或回滚,具体取决于是否存在异常。
总的来说,你想在这里被告知例外情况;如果你无法连接到数据库,你想知道它。我简化了连接处理。关闭连接会自动关闭所有剩余的游标。
最后但是至少,我将您的插入切换为使用 SQL参数。切勿在可以使用参数的情况下使用字符串插值。使用参数可以使数据库缓存语句解析结果,并且最重要的是防止SQL注入攻击。
答案 2 :(得分:1)
您没有在连接上调用commit。您也不应该自己写入数据库文件,数据库引擎正在写入文件。
尝试查看sqlite documentation中的前几个示例,然后应该清楚。
答案 3 :(得分:1)
你没有commit
它。对于writing
进入数据库,它应该被提交。对于读取(选择)操作,不需要。
try:
with connection:
cursor = connection.cursor()
sql = "INSERT INTO Authors VALUES (NULL, ?, ?, ?)"
cursor.execute(sql, (firstname, lastname, email))
connection.commit() # or cursor.commit()
finally:
connection.close()