插入SQLite文件Python - 不起作用

时间:2015-04-06 11:17:33

标签: python sqlite

我在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')

4 个答案:

答案 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()