Python 写多列到 sqlite

Posted

技术标签:

【中文标题】Python 写多列到 sqlite【英文标题】:Python Write a number of columns to sqlite 【发布时间】:2012-10-22 18:00:29 【问题描述】:

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

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 等...在脚本的其他地方定义。

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

所以有人这样使用它: 数据 = ["null", "foo","bar"] db_insert("foo_table", 数据)

这会将数据插入到表名 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

【问题讨论】:

让你的函数使用 **kwargs。 docs.python.org/tutorial/controlflow.html#keyword-arguments 【参考方案1】:

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

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)]

【讨论】:

你应该用双引号括起你的表名 moter,现在我正在使用连接来添加额外的?它现在也为我工作。我认为我的角色也可能存在字符串/元组混淆。谢谢你的评论。非常感谢。

以上是关于Python 写多列到 sqlite的主要内容,如果未能解决你的问题,请参考以下文章

想问一下python输出表格其中1列或多列需要设置为文本格式,代码怎么写?

SQLite python - 将值转换为变量

Python Pandas——在多列上融化、旋转、转置

Python使用Openpyxl库将多行多列数据复制到新Excel表示例

SQL 注入问题 SQLite Python

sqlite python 插入