Python中的数据类型错误匹配尝试使用一些Twitter数据更新Sqlite3数据库

时间:2018-12-20 21:42:02

标签: python sqlite

我认为我的问题与Twitter的created_at日期字段有关,但我不确定。这是我认为是问题的表格:

 sql_create_tweets_table = """ CREATE TABLE IF NOT EXISTS tweets (
                              id integer PRIMARY KEY,
                              user_id integer NOT NULL,
                              created_at text,
                              short_text text,
                              full_text text
                          ); """

我以这种方式转换Twitter创建日期:

 vcreated_at = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(data['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))

这会将传入的“ Tue Nov 13 19:07:58 +0000 2018”更改为 我相信sqLite可以接受的“ 2018-11-13 19:07:58”。更新中仅包含两个整数和两个文本字段。因此,我怀疑该日期正在触发该错误,但是我不确定如何检查它。当我检查created_at和vcreated_at的类型时,它们都是TEXT,就像表列一样。

这是尝试添加行但失败的代码:

 def updateTables(vcreated_at, vid, vtext, vlongtext, vuser_id, vname, 
 vscreen_name):
# now update the sql file

conn = create_connection(my_file)
if conn is not None:
    cur = conn.cursor()

    try:
        cur.execute('''
            INSERT INTO
                tweets 
            VALUES
                (?,?,?,?,?) ''',
                (vcreated_at, vid, vtext, vlongtext, vuser_id))
    except Exception as e: print(e) 

    cur.execute('''
        INSERT INTO 
             users 
        VALUES
            (?,?,?) ''',
            (vuser_id, vname, vscreen_name))

    conn.commit()
    conn.close()

花了几个小时来解决这个问题,但是停滞了!

1 个答案:

答案 0 :(得分:3)

您似乎正在尝试将非INTEGER放入 id 列。由于 id 列是 rowid 的别名(即使用id INTEGER PRIMARY KEY定义,因此它是特殊/通常隐藏的rowid列的别名),因此 是整数值,因此是数据类型不匹配错误。

  • (INTEGER PRIMARY KEY是使列成为rowid列别名的特例) SQLite Autoincrement (自动增量只能用于rowid的别名)
  • 除了此规则的例外情况,您可以将任何类型的值放入任何类型的列中。

要解决此问题,您可以将参数/参数改编为(vid, vuser_id, vcreated_at, vtext, vlongtext)以适合值的预期顺序。

这是按照定义列的顺序的值。

或者,您可以将INSERT INTO tweets (created_at, id, short_text, full_text, user_id) VALUES (?,?,?,?,?)(vcreated_at, vid, vtext, vlongtext, vuser_id)一起使用。

也就是说,您指定值将与之匹配的列。

使用此选项,您的代码将为:-

try:
    cur.execute('''
        INSERT INTO
            tweets (created_at, id, short_text, full_text, user_id)
        VALUES
            (?,?,?,?,?) ''',
            (vcreated_at, vid, vtext, vlongtext, vuser_id))
except Exception as e: print(e)
  • 以上假设 vid 是整数并且是唯一的。如果 vid 的值与另一行的 id 列中的值相同,那么您将收到UNIQUE约束违规,因为rowid的别名是隐式唯一的。