вставить дату и время в ошибку базы данных sqlite3 - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть кадр данных pandas со следующими типами данных

var1            object
var2        datetime64[ns]
var3             object
var4            object
var5             int64
var6            float64

моя схема в базе данных sqlite3 равна

CREATE TABLE IF NOT EXISTS "table_name" (
"var1" TEXT,
"var2" DATETIME,
"var3" TEXT,
"var4" TEXT,
"var5" INT,
"var6" REAL
);

мой запрос в python выглядит следующим образом

query = 'insert into first_north4 (var1, var2, var3, var4, var5, var6) values (?, ?, ?, ?, ?, ?)'
values = [tuple(x) for x in df.values]
cur.executemany(query, values)

При выполнении запроса я получаю эту ошибку msg

sqlite3.InterfaceError: Error binding parameter 1 - probably unsupported type.

Это сбой даты и времени, я не могу понять, почему

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Я нашел рабочее решение для меня (относительно объекта даты), надеюсь, это поможет кому-то еще в будущем.Полностью рабочий пример ниже в python3

import pandas as pd
import datetime as dt
import sqlite3

# est conn (creates db if not exist)
db = 'db_test.db'
conn=sqlite3.connect(db,
detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = conn.cursor()

# create table
query='CREATE TABLE IF NOT EXISTS test(i INT, f REAL, d DATE)'
cur.execute(query)

# some specific datatypes to dataframe
i = [4 ,2 ,44]
f=[1.23,123.2,2.2222]
d = [dt.date.today(),dt.date.today(),dt.date.today()]
df = pd.DataFrame(data=[i,f,d],index = ['i','f','d']).T
print(df)
print(df.dtypes)
print(type(df['i'].values[0]))
print(type(df['f'].values[0]))
print(type(df['d'].values[0]))

# insert
query = 'insert into test (i, f, d) values (? ,?, ?)'
values = [tuple(x) for x in df.values]
print(values)
cur.executemany(query, values)
conn.commit()

# test types when querying the db
query = cur.execute('SELECT * from test')
cols = [column[0] for column in query.description]
data = pd.DataFrame.from_records(data=query.fetchall(), columns=cols)
print(data)
print(data.dtypes)
print(type(data['i'].values[0]))
print(type(data['f'].values[0]))
print(type(data['d'].values[0]))

# close conn
cur.close()
conn.close()
0 голосов
/ 24 ноября 2018

Из документов sqlite doc :

2.2.Дата и время Тип данных

SQLite не имеет класса хранения, выделенного для хранения дат и / или времени.Вместо этого встроенные функции даты и времени SQLite могут сохранять даты и время в виде значений TEXT, REAL или INTEGER:

  • TEXT в виде строк ISO8601 ("YYYY-MM-DD HH:ММ: СС.ссс ").
  • REAL как числа юлианских дней, количество дней с полудня в Гринвиче 24 ноября 4714 г. до н.э. согласно пролетическому
    григорианскому календарю.
  • INTEGER как Unix Time, числосекунд с 1970-01-01 00:00:00 UTC.

Приложения могут сохранять даты и время в любом из этих форматов и свободно конвертировать между форматами, используя встроенные функции даты и времени..

Один из вариантов - преобразовать var2 в строку перед вставкой db (сохраняя, таким образом, тип данных DATETIME в базе данных), как описано здесь .Существуют и другие варианты, и поиск на этом форуме для «datetime64 sqlite» должен обеспечить другие подходы.

...