无法将值插入 QSqlDatabase

Posted

技术标签:

【中文标题】无法将值插入 QSqlDatabase【英文标题】:Cannot insert values into a QSqlDatabase 【发布时间】:2017-10-27 12:45:03 【问题描述】:
from PyQt4 import QtGui,QtSql

def start_prestige():
    m_name = "Prestige"
    m_desc = "                The Prestige is a 2006 Britis-American mystery thriller film directed by Christopher Nolan, from a screenplay adapted by Nolan and his brother Jonathan from Christopher Priest's 1995\n\n novel of the same name." \
              " Its story follows Robert Angier and Alfred Borden, rival stage magicians in London at the end of the 19th century. Obsessed with creating the best stage illusion, they\n\n engage in competitive one-upmanship with tragic results." \
              " The film stars Hugh Jackman as Robert Angier, Christian Bale as Alfred Borden, and David Bowie as Nikola Tesla. It also stars Scarlett\n\nJohansson, Michael Caine, Piper Perabo, Andy Serkis, and Rebecca Hall." \
              " The film reunites Nolan with actors Bale and Caine from Batman Begins and returning cinematographer Wally Pfister,\n\n production designer Nathan Crowley, film score composer David Julyan, and editor Lee Smith."
    m_director = "Christopher Nolan"
    cast = "Hugh Jackman , Christian Bale , Scarlett Johansson , Michael Caine"
    duration = 130
    something(789, m_name, m_director, cast, m_desc, duration)

def something(id, title, director, cast, description, duration):
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('db/test.db')
    if not db.open():
        QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"),
                               QtGui.qApp.tr("Unable to establish a database connection.\n"
                                             "This example needs SQLite support. Please read "
                                             "the Qt SQL driver documentation for information "
                                             "how to build it.\n\n" "Click Cancel to exit."),
                               QtGui.QMessageBox.Cancel)

        return False

    query = QtSql.QSqlQuery()
    query.exec_(
        "create table movie(id INT PRIMARY KEY , title VARCHAR(20), description VARCHAR(1000), director VARCHAR(100), cast VARCHAR(100), duration_min INT")
    query.prepare("INSERT INTO movie VALUES(?,?,?,?,?,?)")
    query.addBindValue(id, title, description, director, cast, duration)
    if query.exec_():
        db.commit()

start_prestige()

这里的问题是我无法将值插入数据库,因为它显示了 TypeError:

TypeError: QSqlQuery.addBindValue(QVariant, QSql.ParamType type=QSql.In): 参数 2 具有意外类型“str”

【问题讨论】:

【参考方案1】:

您一次只能添加 一个 绑定值。所以你必须这样做:

query.prepare("INSERT INTO movie VALUES(?,?,?,?,?,?)")
query.addBindValue(id)
query.addBindValue(title)
query.addBindValue(description)
query.addBindValue(director)
query.addBindValue(cast)
query.addBindValue(duration)

或类似的东西:

def something(*args):
    ...
    query.prepare("INSERT INTO movie VALUES(?,?,?,?,?,?)")
    for arg in args:
        query.addBindValue(arg)

addBindValue 调用的顺序必须与 SQL 语句中占位符的数量和顺序相匹配。

【讨论】:

以上是关于无法将值插入 QSqlDatabase的主要内容,如果未能解决你的问题,请参考以下文章

无法将值 NULL 插入列 - 如何强制标识增加? [关闭]

无法将值插入 QSqlDatabase

无法将值 NULL 插入列“id”、表“XXX”;列不允许空值。插入失败

无法将值插入 MySQL 表

SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败

无法将值插入表中,外键约束不断失败