Тип данных Mistmatch в Python пытается обновить базу данных Sqlite3 с некоторыми данными Twitter - PullRequest
0 голосов
/ 21 декабря 2018

Я думаю, что моя проблема связана с полем даты твиттера create_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
                          ); """

Я конвертирую дату в Твиттере созданный_тем следующим образом:

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

Это меняет входящие "Вт 13 ноября 19:07: 58 +0000 2018 "до" 2018-11-13 19:07:58 ", что я считаю приемлемым для sqLite.В обновление включены только два целых и два текстовых поля.Поэтому я подозреваю, что дата вызывает ошибку, но я не уверен, как это проверить.Когда я проверяю тип create_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 голосов
/ 21 декабря 2018

Похоже, что вы пытаетесь поместить не INTEGER в столбец id .Поскольку столбец id является псевдонимом rowid (т. Е. Определенное с помощью id INTEGER PRIMARY KEY делает его псевдонимом специального / обычно скрытого столбца rowid), должно бытьцелочисленное значение и, следовательно, ошибка несоответствия типов данных.

  • (INTEGER PRIMARY KEY - особый случай, который делает столбец псевдонимом столбца rowid) Автоинкремент SQLite (автоинкремент может использоваться только для псевдонима строки)
  • Кроме этого исключения из правила, вы можете поместить любой тип значения в любой тип столбца.

Чтобы решить эту проблему, можно перетасовать параметры / аргументы на (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 неявно уникален.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...