>

sqlite3 데이터베이스에 약 1000 개의 부동 소수점 수의 numpy 배열을 저장하려고하는데 "InterfaceError : Error binding parameter 1-아마도 지원되지 않는 유형"이라는 오류가 계속 발생합니다.

BLOB 데이터 유형은 무엇이든 될 수 있다는 인상을 받았지만 분명히 numpy 배열에서는 작동하지 않습니다. 내가 시도한 것은 다음과 같습니다.

import sqlite3 as sql
import numpy as np
con = sql.connect('test.bd',isolation_level=None)
cur = con.cursor()
cur.execute("CREATE TABLE foobar (id INTEGER PRIMARY KEY, array BLOB)")
cur.execute("INSERT INTO foobar VALUES (?,?)", (None,np.arange(0,500,0.5)))
con.commit()

numpy 배열을 테이블에 가져 오는 데 사용할 수있는 다른 모듈이 있습니까? 또는 numpy 배열을 파이썬에서 sqlite가 수락 할 목록이나 문자열과 같은 다른 형식으로 변환 할 수 있습니까? 성능은 우선 순위가 아닙니다. 그냥 작동하기를 원합니다!

감사합니다!


  • 답변 # 1

    이것은 저에게 효과적입니다 :

    import sqlite3 as sql
    import numpy as np
    import json
    con = sql.connect('test.db',isolation_level=None)
    cur = con.cursor()
    cur.execute("DROP TABLE FOOBAR")
    cur.execute("CREATE TABLE foobar (id INTEGER PRIMARY KEY, array BLOB)")
    cur.execute("INSERT INTO foobar VALUES (?,?)", (None, json.dumps(np.arange(0,500,0.5).tolist())))
    con.commit()
    cur.execute("SELECT * FROM FOOBAR")
    data = cur.fetchall()
    print data
    data = cur.fetchall()
    my_list = json.loads(data[0][1])
    
    

  • 답변 # 2

    지정된 다른 방법은 저에게 효과적이지 않습니다. 그리고 def adapt_array(arr): out = io.BytesIO() np.save(out, arr) out.seek(0) return sqlite3.Binary(out.read()) 가있는 것 같습니다  지금 방법과 numpy.tobytes  (바이트 문자열에서 작동하지만) 더 이상 사용되지 않으며 권장되는 방법은 numpy.fromstring 입니다. .

    numpy.frombuffer
    
    

    고기와 감자에 오기

    import sqlite3
    import numpy as np
    sqlite3.register_adapter(np.array, adapt_array)    
    sqlite3.register_converter("array", convert_array)
    
    

    응용 프로그램에서 테스트했으며 def adapt_array(arr): return arr.tobytes() def convert_array(text): return np.frombuffer(text) 에서 잘 작동합니다.  그리고 Python 3.7.3

    numpy 1.16.2   numpy.fromstring 와 동일한 출력을 제공합니다  

    DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead

관련 자료

  • 이전 vbnet의 쿼리 문자열에서 $expand를 전달하지 않고 모든 속성을 확장 (odata-webapi)하는 방법
  • 다음 python - sklearmixture의 GMM 라이브러리에 문제가 있습니까?