【问题标题】:python insert data into sqlite3 tablepython将数据插入sqlite3表
【发布时间】:2020-09-12 14:14:46
【问题描述】:

我正在使用 python 3.7 和 sqlite3 将数据写入我的数据库。我有这个功能

def add_item(self, item):
    stmt = "INSERT INTO users (id) VALUES (?)"
    args = (item,)
    self.conn.execute(stmt, args)
    self.conn.commit()

它工作正常,但它只允许我将数据写入 id 列。我怎样才能使这个函数动态化,以便我可以将任何数据添加到任何列?

# new variable to specify column to write to

def add_item(self, item, column):
    stmt = "INSERT INTO users (column) VALUES (?)"
    args = (item,)
    self.conn.execute(stmt, args)
    self.conn.commit()

【问题讨论】:

    标签: python python-3.x sqlite


    【解决方案1】:

    您需要根据所提供的列和值列表的长度动态构建列名和值占位符列表。

    这可以使用str.join 完成,但是您可能需要处理调用者将单个字符串作为列名和单个值传递的情况。

    def add_item(self, values, columns):
        # Check for single column insert
        if isinstance(columns, str):
            values, columns = (values,), (columns,)
        assert len(values) == len(columns), 'Mismatch between values and columns'
    
        template = """INSERT INTO users ({}) VALUES ({})"""
    
        cols = ','.join([f'"{col}"' for col in columns])
        placeholders = ','.join(['?'] * len(values))
        stmt = template.format(cols, placeholders)
    
        self.conn.execute(stmt, values)
        self.conn.commit()
        return
    

    【讨论】:

    • 谢谢。我真的需要提交还是自动提交?
    • 自动提交默认是关闭的,但是你可以将连接的isolation_level属性设置为None,或者将isolation_level=None传递给连接构造函数。请参阅Controlling Transactios 上的文档。
    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多