Python中的数据类型Mistmatch试图用一些twitter数据更新Sqlite3数据库

2024-10-06 07:53:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我的问题与twitter创建的日期字段有关,但我不确定。以下是我认为问题所在的表格:

 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'))

这将即将到来的“11月13日星期二19:07:58+0000 2018”更改为 “2018-11-13 19:07:58”,我认为sqLite可以接受。更新中只包含两个整数和两个文本字段。所以我怀疑是日期触发了错误,但我不知道如何检查它。当我检查created_at和vcreated_at的类型时,它们都是文本,就像表列一样

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

 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()

花了几个小时在这上面,但是卡住了


Tags: text文本idsqltimecreatenotinteger
1条回答
网友
1楼 · 发布于 2024-10-06 07:53:43

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

  • (整型主键是使列成为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列中存在的值相同,则会得到唯一约束冲突,因为rowid的别名是隐式唯一的

相关问题 更多 >