在 Python 中:一次将 QtableWidget 中的所有条目插入数据库表中

Posted

技术标签:

【中文标题】在 Python 中:一次将 QtableWidget 中的所有条目插入数据库表中【英文标题】:In Python: Insert all Entries in a QtableWidget into Database Table at once 【发布时间】:2021-07-07 07:56:55 【问题描述】:

想知道是否有人知道如何使用 python 将 qtablewidget 的所有条目插入数据库。到目前为止,我发现了这个编码:

# Creating a query for later execution using .prepare()
insertDataQuery = QSqlQuery()
insertDataQuery.prepare(
    """
    INSERT INTO contacts (
        name,
        job,
        email
    )
    VALUES (?, ?, ?)
    """
)

# Sample data
data = [
    ("Joe", "Senior Web Developer", "joe@example.com"),
    ("Lara", "Project Manager", "lara@example.com"),
    ("David", "Data Analyst", "david@example.com"),
    ("Jane", "Senior Python Developer", "jane@example.com"),
]

# Use .addBindValue() to insert data
for name, job, email in data:
    insertDataQuery.addBindValue(name)
    insertDataQuery.addBindValue(job)
    insertDataQuery.addBindValue(email)
    insertDataQuery.exec()

我一直在将 qtablewidget 的条目分配给数据

【问题讨论】:

你可以在这里找到有用的东西:***.com/questions/53035570/… 【参考方案1】:

您可以使用以下方法:

# Ignore lazy imports
import sys
from typing import *

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *
from PyQt5.QtWidgets import *

首先,让我们创建一个函数,使用您提供的数据返回 QTableWidget

def createTable() -> QTableWidget:
    """Let's create a QTableWidget with the data you provided."""

    data = [
        ("Joe", "Senior Web Developer", "joe@example.com"),
        ("Lara", "Project Manager", "lara@example.com"),
        ("David", "Data Analyst", "david@example.com"),
        ("Jane", "Senior Python Developer", "jane@example.com"),
    ]

    table = QTableWidget()

    table.setRowCount(len(data))
    table.setColumnCount(len(data[0]))

    for i, row in enumerate(data):
        for j, val in enumerate(row):
            table.setItem(i, j, QTableWidgetItem(val))

    return table

现在我们创建一个函数来从表中获取数据并以完全相同的格式返回:

def getData(table: QTableWidget) -> List[Tuple[str]]:
    """Fetch the data from the QTableWidget and return it as `data`."""

    data = []
    for row in range(table.rowCount()):
        rowData = []
        for col in range(table.columnCount()):
            rowData.append(table.item(row, col).data(Qt.EditRole))
        data.append(tuple(rowData))

    return data

对于db insert部分,我们可以复用你提供的代码:

def insertData(data: List[Tuple[str]]) -> None:
    """Creating a query for later execution using .prepare()"""

    insertDataQuery = QSqlQuery()
    insertDataQuery.prepare(
        """
        INSERT INTO contacts (
            name,
            job,
            email
        )
        VALUES (?, ?, ?)
        """
    )
    # Use .addBindValue() to insert data
    for name, job, email in data:
        insertDataQuery.addBindValue(name)
        insertDataQuery.addBindValue(job)
        insertDataQuery.addBindValue(email)
        insertDataQuery.exec_()

    # Note that you need to run `QSqlDatabase().commit()`` if you want the data to be committed in the database.  

现在把它们放在一起:

app = QApplication([sys.argv])

# Connect to sample database
sampleDb = QSqlDatabase.addDatabase("QSQLITE")
sampleDb.setDatabaseName("sample.sqlite")
sampleDb.open()


# Create table with sample data
table = createTable()

# Get data from table
data = getData(table)

# Insert data into the database
insertData(data)


sys.exit(app.exec_())

【讨论】:

嘿,谢谢,这真的让我更进一步。只有最后一个 insertDataQuery.exec() 不起作用。它说 TypeError: exec(self, str): not enough arguments 你能更好地描述你的问题吗? 我有这样的编码: insertDataQuery = QSqlQuery() insertDataQuery.prepare( """ INSERT INTO Test01 ( Quantity, ProductId, Description, Price, Tax, NetTotal, GrossTotal ) VALUES (?, ?, ? , ?, ?, ?, ?) """ ) data = getData(self.tableWidgetInvoiceItem) for Quantity, ProductId, Description, Price, Tax, NetTotal, GrossTotal in data: insertDataQuery.addBindValue(Quantity) insertDataQuery.addBindValue(ProductId) insertDataQuery.addBindValue(Description) insertDataQuery.addBindValue(Price) insertDataQuery .addBindValue(Tax) insertDataQuery.addBindValue(NetTotal) insertDataQuery.addBindValue(GrossTotal) insertDataQuery.exec() helper.conn.commit() 并在 insertDataQuery.exec() 部分给出错误 TypeError: exec(self, str): not enough arguments

以上是关于在 Python 中:一次将 QtableWidget 中的所有条目插入数据库表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中一次将多个对象添加到 ManyToMany 关系?

如何一次将屏幕方向应用于纵向所有布局 android studio

有没有办法使用 Sequelize 一次将多个嵌入式模型保存在数据库中

AVAudioPlayer 是从磁盘流式传输文件,还是一次将其全部加载到内存中?

是否可以在 C# winforms 中一次将文本写入多个文本框?

如何一次将值从数组中移出一个?