插入SQLite文件Python-不起作用
我有一个简单的带有SQLite的Python数据库应用程序。我编写了一个简单的程序来创建数据库并插入一些值。但是,创建了数据库,但没有插入新值,我不知道为什么:插入SQLite文件Python-不起作用,python,sqlite,Python,Sqlite,我有一个简单的带有SQLite的Python数据库应用程序。我编写了一个简单的程序来创建数据库并插入一些值。但是,创建了数据库,但没有插入新值,我不知道为什么: #!/usr/bin/python # -*- coding: utf-8 -*- import sqlite3 as lite import sys def CreateTable(): try: connection = lite.connect(':memory:') with c
#!/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')
不能使用sql命令连接到文本文件。
sqlite3.connect
需要或创建一个二进制文件。不能使用sql命令连接到文本文件。
sqlite3.connect
需要或创建一个二进制文件。您误解了connection.iterdump()
的用途。您正在为SQLite创建SQL文本,以便以后再次执行。它不是数据库本身。如果您只想输出SQL语句,您可以直接编写SQL语句,那么首先通过SQLite传递SQL语句没有什么意义
您也不能使用SQL语句将SQLite“连接”到文本文件;您必须将这些语句作为文本加载,然后重新播放它们。然而,我认为你并不想要这样
可以连接到现有数据库以插入其他行。每次需要添加数据时,只需连接:
请注意,将连接用作上下文管理器已经可以确保提交或回滚事务,具体取决于是否存在异常
总的来说,您希望在此了解例外情况;如果您无法连接到数据库,您可能希望了解它。我简化了连接处理。关闭连接将自动关闭所有剩余的游标
最后,我将插入切换为使用SQL参数。如果可以使用参数,则不要使用字符串插值。使用参数可以使数据库缓存语句分析结果,最重要的是可以防止SQL注入攻击。您误解了连接.iterdump()的作用。您正在为SQLite创建SQL文本,以便以后再次执行。它不是数据库本身。如果您只想输出SQL语句,您可以直接编写SQL语句,那么首先通过SQLite传递SQL语句没有什么意义 您也不能使用SQL语句将SQLite“连接”到文本文件;您必须将这些语句作为文本加载,然后重新播放它们。然而,我认为你并不想要这样 可以连接到现有数据库以插入其他行。每次需要添加数据时,只需连接: 请注意,将连接用作上下文管理器已经可以确保提交或回滚事务,具体取决于是否存在异常 总的来说,您希望在此了解例外情况;如果您无法连接到数据库,您可能希望了解它。我简化了连接处理。关闭连接将自动关闭所有剩余的游标
最后,我将插入切换为使用SQL参数。如果可以使用参数,则不要使用字符串插值。使用参数可以使数据库缓存语句分析结果,最重要的是可以防止SQL注入攻击。您没有在连接上调用commit。您也不应该自己写入数据库文件,因为数据库引擎正在写入该文件
尝试浏览中的前几个示例,应该很清楚。您没有在连接上调用commit。您也不应该自己写入数据库文件,因为数据库引擎正在写入该文件
试着浏览中的前几个示例,应该很清楚。您没有提交它。对于
写入数据库,应该提交它。对于读取(选择)操作,不需要
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()
您没有提交它。对于将它写入数据库,应该提交它。对于读取(选择)操作,不需要
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()
OP在哪里使用文本文件插入?那么我如何将一些值附加到现有的sqlite数据库中?啊,我明白你的意思,内存中的数据库处理得非常奇怪。OP在哪里使用文本文件插入?那么我如何将一些值附加到现有的sqlite数据库中?啊,我明白你的意思,内存中的数据库处理得非常奇怪。为什么有两个不同的数据库连接?一个在内存中,另一个在文件中。因为我需要将一些值附加到已经创建的数据库中。有可能吗?那就打开一个到那个数据库的连接。SQLite数据库文件不像文本文件,您不需要附加到它们。让SQLite来管理文件中的数据。那么怎么做呢?我真的不明白。我的问题是,我编写了一个相当大的应用程序,我需要在某个时候创建数据库,然后让用户向其中添加(插入)一些值,这样它将存储在以前创建的数据库中—只需连接到现有数据库即可。您已经编写了表创建,这样它只会在不存在表的情况下创建表。为什么有两个不同的数据库连接?一个在内存中,另一个在文件中。因为我需要将一些值附加到已经创建的数据库中。有可能吗?那就打开一个到那个数据库的连接。SQLite数据库文件不像文本文件,您不需要附加到它们。让SQLite来管理文件中的数据。那么怎么做呢?我真的不明白。我的问题是,我编写了一个相当大的应用程序,我需要在某个时候创建数据库,然后让用户向其中添加(插入)一些值,这样它将存储在以前创建的数据库中—只需连接到现有数据库即可。您已经编写了表的创建,这样它只会创建表,如果还没有的话。谢谢,现在我知道了。我唯一可以添加到您的答案中的是,您需要编写ID INTEGER PRIMARY KEY NOT NULL
而不是ID INT PRIMARY KEY NOT NULL