在sqlite3数据库中插入datetime错误

时间:2018-11-22 13:56:20

标签: python sqlite sqldatatypes

我有一个具有以下数据类型的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)

执行查询时,出现此错误消息

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

这是失败的日期时间,我不知道为什么

2 个答案:

答案 0 :(得分:0)

来自sqlite datatypes doc

  

2.2。日期和时间数据类型

     

SQLite没有预留存储类来存储日期   和/或时间。相反,SQLite内置的日期和时间函数   能够将日期和时间存储为TEXT,REAL或INTEGER   值:

     
      
  • 文本为ISO8601字符串(“ YYYY-MM-DD HH:MM:SS.SSS”)。
  •   
  • REAL为朱利安天数,是公元前4714年11月24日格林威治中午以来的天数。根据多方面的
      公历。
  •   
  • INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
  •   
     

应用程序可以选择以以下任何一种方式存储日期和时间   格式,并使用内置日期和格式在格式之间自由转换   时间函数。

一种选择是按照here的描述,在db插入之前将var2转换为字符串(从而在数据库中保留DATETIME数据类型)。还有其他选择,在此论坛上搜索“ datetime64 sqlite”应该提供其他方法。

答案 1 :(得分:0)

我为我找到了一个可行的解决方案(关于日期对象),希望这会在将来对其他人有所帮助。下面的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()