1

我正在做一个小项目,我创建了一个辅助函数,它将一串逗号分隔的值写入数据库,就好像它们是值一样。我意识到这样做会产生影响,但这很小,我需要让它继续下去,直到我能做得更好

def db_insert(table,data):
    """
    insert data into a table, the data should be a tuple
    matching the number of columns with null for any columns that
    have no value. False is returned on any error, error is logged to
    database log file."""

    if os.path.exists(database_name):
        con = lite.connect(database_name)

    else:
        error = "Database file does not exist."
        to_log(error)
        return False

    if con:
        try:
            cur = con.cursor()
            data = str(data)
            cur.execute('insert into %s values(%s)') % (table, data)
            con.commit()
            con.close()

        except Exception, e:
            pre_error = "Database insert raised and error;\n"
            thrown_error = pre_error + str(e)
            to_log(thrown_error)

        finally:
            con.close()


    else:
        error = "No connection to database"
        to_log(error)
        return False

database_name 等...在脚本的其他地方定义。

除非有任何其他明显的明显错误;我需要能够做的(通过这种方法或其他方法,如果有建议)是允许某人创建一个列表,其中每个值代表一个列值。因为我不知道要填充多少列。

所以有人使用它如下:
data = ["null", "foo","bar"]
db_insert("foo_table", data)

这会将数据插入到表名 foo_table 中。用户可以知道表中有多少列,并提供正确数量的元素来满足这一点。我意识到最好使用 sqlite 参数,但有两个问题。首先,您不能使用参数仅指定表中的值。其次是你需要知道你提供了多少价值。你所要做的;

cur.execute('插入表值(?,?,?), val1,val2,val3)

您需要能够指定三个?我正在尝试编写一个通用函数,该函数允许我获取任意数量的值并将它们插入到任意表名中。现在,在我尝试将“null”作为值传递之前,它的工作相对正常。其中一列是主键并具有自动增量。所以传入 null 将允许它自动递增。还有其他需要空值的情况。问题是python一直将我的null用单引号括起来,sqlite抱怨它是数据类型不匹配,因为主键是一个整数字段。如果我尝试将 None 作为 python null 等效项传递,则会发生同样的事情。所以有两个问题。

如何插入任意数量的列。
如何传递一个空值。

感谢您对这个问题和过去问题的所有帮助。

抱歉,这看起来像这个 Using Python quick insert many columns into Sqlite\Mysql

很抱歉,直到我写完这篇文章后我才找到它。

结果如下:

def db_insert(table,data):
"""
insert data into a table, the data should be a tuple
matching the number of columns with null for any columns that
have no value. False is returned on any error, error is logged to
database log file."""

if os.path.exists(database_name):
    con = lite.connect(database_name)

else:
    error = "Database file does not exist."
    to_log(error)
    return False

if con:
    try:
        tuple_len = len(data)
        holders = ','.join('?' * tuple_len)

        sql_query = 'insert into %s values({0})'.format(holders) % table
        cur = con.cursor()
        #data = str(data)
        #cur.execute('insert into readings values(%s)') % table
        cur.execute(sql_query, data)
        con.commit()
        con.close()

    except Exception, e:
        pre_error = "Database insert raised and error;\n"
        thrown_error = pre_error + str(e)
        to_log(thrown_error)

    finally:
        con.close()


else:
    error = "No connection to database"
    to_log(error)
    return False
4

1 回答 1

2

第二个问题是“为我工作”。当我将 None 作为值传递时,它将正确地将该值与数据库进行来回转换。

import sqlite3
conn = sqlite3.connect("test.sqlite")

data = ("a", None)
conn.execute('INSERT INTO "foo" VALUES(' + ','.join("?" * len(data)) + ')', data)

list(conn.execute("SELECT * FROM foo"))      # -> [("a", None)]
于 2012-10-22T18:06:54.673 回答