Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入SQLite文件Python-不起作用_Python_Sqlite - Fatal编程技术网

插入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

我有一个简单的带有SQLite的Python数据库应用程序。我编写了一个简单的程序来创建数据库并插入一些值。但是,创建了数据库,但没有插入新值,我不知道为什么:

#!/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