python中sqllite插入numpy数组到数据库的实现方法

作者:修炼之路 时间:2024-01-16 20:31:29 

sqllite里面并没有与numpy的array类型对应的数据类型,通常我们都需要将数组转换为text之后再插入到数据库中,或者以blob类型来存储数组数据,除此之外我们还有另一种方法,能够让我们直接以array来插入和查询数据,实现代码如下


import sqlite3
import numpy as np
import io

def adapt_array(arr):
   out = io.BytesIO()
   np.save(out, arr)
   out.seek(0)
   return sqlite3.Binary(out.read())

def convert_array(text):
   out = io.BytesIO(text)
   out.seek(0)
   return np.load(out)

# 当插入数据的时候将array转换为text插入
sqlite3.register_adapter(np.ndarray, adapt_array)

# 当查询数据的时候将text转换为array
sqlite3.register_converter("array", convert_array)

#连接数据库
con = sqlite3.connect("test.db", detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.cursor()

#创建表
cur.execute("create table test (arr array)")

#插入数据
x = np.arange(12).reshape(2,6)
cur.execute("insert into test (arr) values (?)", (x, ))

#查询数据
cur.execute("select arr from test")
data = cur.fetchone()[0]

print(data)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]]
print(type(data))
# <type 'numpy.ndarray'>

实例代码看下Python 操作sqlite数据库及保存查询numpy类型数据


# -*- coding: utf-8 -*-
'''
Created on 2019年3月6日

@author: Administrator
'''
import sqlite3
import numpy as np
import io

def adapt_array(arr):

out = io.BytesIO()
   np.save(out, arr)
   out.seek(0)
   return sqlite3.Binary(out.read())

def convert_array(text):
   out = io.BytesIO(text)
   out.seek(0)
   return np.load(out)

# 创建数据库连接对象
conn = sqlite3.connect('sample_database.db', detect_types=sqlite3.PARSE_DECLTYPES)  # 连接到SQLite数据库
'''
sqlite3.PARSE_DECLTYPES
本常量使用在函数connect()里,设置在关键字参数detect_types上面。表示在返回一行值时,是否分析这列值的数据类型定义。如果设置了本参数,就进行分析数据表列的类型,并返回此类型的对象,并不是返回字符串的形式。

sqlite3.PARSE_COLNAMES
本常量使用在函数connect()里,设置在关键字参数detect_types上面。表示在返回一行值时,是否分析这列值的名称。如果设置了本参数,就进行分析数据表列的名称,并返回此类型的名称
'''
# 参数:memory:来创建一个内存数据库
# conn = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)

# Converts np.array to TEXT when inserting
sqlite3.register_adapter(np.ndarray, adapt_array)

# Converts TEXT to np.array when selecting
sqlite3.register_converter("array", convert_array)

x = np.arange(12).reshape(2, 6)

# conn = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cursor = conn.cursor()
# 创建数据库表
cursor.execute("create table test (arr array)")
# 插入一行数据
cursor.execute("insert into test (arr) values (?)", (x,))
# 提交
conn.commit()

cursor.execute("select arr from test")
data = cursor.fetchone()[0]

print(data)
'''
[[ 0  1  2  3  4  5]
[ 6  7  8  9 10 11]]
'''
print(type(data))
'''
<class 'numpy.ndarray'>
'''
cursor.close()  # 关闭Cursor
conn.close()  # 关闭数据库

来源:https://blog.csdn.net/sinat_29957455/article/details/118027857

标签:python,numpy,数组,sqllite
0
投稿

猜你喜欢

  • 教你用Python写一个植物大战僵尸小游戏

    2021-07-19 22:59:37
  • python 如何将数据写入本地txt文本文件的实现方法

    2021-05-02 14:11:52
  • python实现批处理文件

    2022-08-14 19:27:46
  • 一直闪烁变色的超级链接代码

    2008-02-27 13:08:00
  • PHP htmlspecialchars()函数用法与实例讲解

    2023-06-02 16:48:38
  • 一文教你学会定位线上MySQL锁超时问题

    2024-01-22 13:19:45
  • Pyecharts 动态地图 geo()和map()的安装与用法详解

    2023-08-16 17:07:34
  • golang中net的tcp服务使用

    2023-08-30 10:54:14
  • ITK 实现多张图像转成单个nii.gz或mha文件案例

    2023-02-18 20:39:51
  • 基于 Mysql 实现一个简易版搜索引擎

    2024-01-25 02:00:38
  • python目标检测IOU的概念与示例

    2022-04-19 07:41:25
  • Python爬虫获取基金净值信息详情

    2022-04-23 07:53:42
  • Babylon使用麦克风并处理常见问题解决

    2024-04-29 13:25:53
  • Python自动化之定位方法大杀器xpath

    2023-11-22 05:08:57
  • HTML中使背景图片自适应浏览器大小实例详解

    2024-05-02 16:18:32
  • python递归调用中的坑:打印有值, 返回却None

    2023-11-02 23:07:42
  • Dreamweaver的CSS布局ul和li范例

    2009-08-28 12:34:00
  • ThinkPHP视图查询详解

    2024-05-03 15:52:08
  • 用SQL语句查询数据库中某一字段下相同值的记录方法

    2024-01-23 14:49:54
  • echarts图表设置宽度100%结果为100px的解决办法

    2024-04-18 09:50:19
  • asp之家 网络编程 m.aspxhome.com