sqlite 如何在SQL中使用INSERT OR IGNORE

kfgdxczn  于 2023-03-19  发布在  SQLite
关注(0)|答案(1)|浏览(418)

我想从机器学习模型中获取输入数据,然后进行预测以插入sql数据库。我还想避免保存已经保存的输入和预测数据。

`for i in range(5):
    
    if models.predict([data["Complaint1"][i]])=="STUDENTS":
        new_data=pd.concat([
                    pd.DataFrame(vectoriserst.transform([data['Complaint1'][i]]).toarray(), columns=vectoriserst.get_feature_names()),
                    pd.DataFrame(vectoriserst.transform([data['complaint2'][i]]).toarray(), columns=vectoriserst.get_feature_names())
                  ], axis=1
                   
                  )
        Predictions=modelst.predict(new_data) 
     else :
         new_data=pd.concat([
                    pd.DataFrame(vectoriserfc.transform([data['Complaint1'][i]]).toarray(), columns=vectoriserfc.get_feature_names()),
                    pd.DataFrame(vectoriserfc.transform([data['complaint2'][i]]).toarray(), columns=vectoriserfc.get_feature_names())
                  ], axis=1
                   
                  )
        Predictions=modelfc.predict(new_data)

    conn=sqlite3.connect("mydata.db")
    cur=conn.cursor()
    cur.execute(
    """
   CREATE TABLE Table ( id integer PRIMARY KEY,
                                 FolderNumber TEXT,
                                 Complaint1 TEXT,
                                 Complaint2 TEXT,
                                 Prediction)
   """
   )
 

      cur.execute("INSERT OR IGNORE INTO Table (FolderNumber, Complaint1, Complaint2, Prediction ) VALUES('%s', '%s', '%s', '%s')" %(data['FolderNumber'][i], data['Complaint1'][i], data['Complaint2'][i], Prediction))
    conn.commit()
    conn.close()

'

hjqgdpho

hjqgdpho1#

IGNORE将仅忽略UNIQUE/PRIMARY KEY/CHECK/NOT NULL冲突的约束冲突。
在您创建的表中,唯一具有此类约束条件的列是ID列。由于您没有提供值,因此由于它是rowid的别名,因此将生成值(1,然后可能是2,然后可能是3....)而不是空值,并且该值将是唯一值。
因此,您永远不会遇到冲突,因此不会忽略任何插入。

我还希望避免保存已经保存的输入和预测数据。
如果“已保存的输入”可以由单个列确定,则很可能需要UNIQUE约束。如果“已保存的输入”等于多个列,则需要将这些列设为PRIMARY KEY,或者对这些列使用UNIQUE INDEX。
基于代码中的SQL,也许可以考虑下面的例子,它由三个示例组成。
第一个示例基于您的表定义,并允许插入复制的数据,如前所述。
第二个示例清空表,然后添加UNIQUE索引。这次只插入1行,忽略其他行。
第三个示例在删除表后创建表,并将UNIQUE约束添加到预测列。
SQL为:-

DROP TABLE IF EXISTS `table`;
/* EXAMPLE 1 - original */
CREATE TABLE `Table` ( id integer PRIMARY KEY,
    FolderNumber TEXT,
    Complaint1 TEXT,
    Complaint2 TEXT,
    Prediction
)
;
INSERT OR IGNORE INTO `Table` (FolderNumber, Complaint1, Complaint2, Prediction ) 
    VALUES
        ('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s')
;

/* EXAMPLE 2 UNIQUE INDEX */
DELETE FROM `table`;
CREATE UNIQUE INDEX IF NOT EXISTS uidx_table_prediction ON `table` (prediction);
INSERT OR IGNORE INTO `Table` (FolderNumber, Complaint1, Complaint2, Prediction ) 
    VALUES
        ('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s')
;

/* EXAMPLE 3 UNIQUE column constraint */
DROP TABLE IF EXISTS `table`;
CREATE TABLE `Table` ( id integer PRIMARY KEY,
    FolderNumber TEXT,
    Complaint1 TEXT,
    Complaint2 TEXT,
    Prediction UNIQUE
)
;
INSERT OR IGNORE INTO `Table` (FolderNumber, Complaint1, Complaint2, Prediction ) 
    VALUES
        ('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s')
;
DROP TABLE IF EXISTS `table`;

SQLite工具(Navicate for SQLite)的输出为:-

DROP TABLE IF EXISTS `table`
> OK
> Time: 0.117s

CREATE TABLE `Table` ( id integer PRIMARY KEY,
    FolderNumber TEXT,
    Complaint1 TEXT,
    Complaint2 TEXT,
    Prediction
)
> OK
> Time: 0.024s

INSERT OR IGNORE INTO `Table` (FolderNumber, Complaint1, Complaint2, Prediction ) 
    VALUES
        ('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s')
> Affected rows: 3
> Time: 0.024s

DELETE FROM `table`
> Affected rows: 3
> Time: 0.024s

CREATE UNIQUE INDEX IF NOT EXISTS uidx_table_prediction ON `table` (prediction)
> OK
> Time: 0.024s

INSERT OR IGNORE INTO `Table` (FolderNumber, Complaint1, Complaint2, Prediction ) 
    VALUES
        ('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s')
> Affected rows: 1
> Time: 0.024s

DROP TABLE IF EXISTS `table`
> OK
> Time: 0.024s

CREATE TABLE `Table` ( id integer PRIMARY KEY,
    FolderNumber TEXT,
    Complaint1 TEXT,
    Complaint2 TEXT,
    Prediction UNIQUE
)
> OK
> Time: 0.024s

INSERT OR IGNORE INTO `Table` (FolderNumber, Complaint1, Complaint2, Prediction ) 
    VALUES
        ('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s'),('%s', '%s', '%s', '%s')
> Affected rows: 1
> Time: 0.024s

即,受影响的行(插入行)对于后两个示例是1,而对于第一个示例是3。

相关问题