Python中的数据类型不匹配,试图用一些twitter数据更新Sqlite3数据库



我认为我的问题与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'))

这将即将到来的"2018年11月13日星期二19:07:58+0000"更改为"2018-11-13 19:07:58"我认为这是sqLite可以接受的。更新中只包含两个整数字段和两个文本字段。所以我怀疑日期触发了错误,但我不知道如何检查。当我检查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()

花了几个小时在这上面,但坚持了下来!

您似乎正试图将一个非整数放入id列中。由于id列是rowid须是整数值,因此会出现数据类型不匹配错误。

  • (INTEGER PRIMARY KEY是一种特殊情况,它使列成为rowid列的别名(SQLite Autoincrement
  • 除了此规则例外,您可以将任何类型的值放入任何类型的列中

要解决此问题,可以将参数/自变量重新排列为(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的别名是隐式唯一的

最新更新