質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3040閲覧

Python sqlite3.OperationalError について

kokono

総合スコア14

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/12 06:01

編集2020/06/15 03:54

質問失礼します。現在私はRosetta-beta3というPythonで書かれたプログラムを使うことを検討しています。
モデルはANN_Module.py, DB_Module.py, Rpredict.pyから構成されており、作成者様はRpredict.pyを回すだけでターゲットを導出できるとされています。
しかし、プログラムを回してみると以下のようなエラーが表示されました。

Python

1Traceback (most recent call last) 2 File "Rpredict.py", line86, in <module> 3  ptf_model=PTF_MODEL(2, db) 4 File "ANN_Module.py", line 717, in_init_ 5 self.ann_models.append(ANN_MODEL(self.model_id[i],db)) 6 File "ANN_Module.py", line 602, in_int_ 7 cursor.execute(self.ann_query_clause % (model_id)) 8sqlite3.OperationalError: Could not decode to UTF-8 column 'ann_bin' with text' d1a552(以下文字化け)

このエラーについて調べたところ、UTF-8へのデコードが文字化けしてできないことが原因ということで、
その前にtext_factoryをstrに定義するとよい、と書いてありました。

そこでimportもとであるDB_Module.pyを確認してみたのですが,すでに self.conn.text_factory = str
と定義されていました。このためどこを訂正すればよいのか分からない状態にあります。
まだまだPythonに不慣れで必要な情報を載せることが出来ているか分かりませんが、
何卒よろしくお願いいたします。

(追記)
OSはwindouws7, PythonはPython 3.6 -64bitです。現在テストとしてコマンドプロンプトからテストデータを指定し、
Rpredict.pyを回しています。
ダウンロードURL(論文です。ページ下部、Supplementary resource Rosetta3 codeからダウンロード、ファイルを解凍し、コード、
テストデータを得ました。)
https://www.researchgate.net/publication/312491306_Weighted_Recalibration_of_the_Rosetta_Pedotransfer_Model_with_Improved_Estimates_of_Hydraulic_Parameter_Distributions_and_Summary_Statistics_Rosetta3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/06/12 06:05

実行してるOSがなにか、 Pythonのバージョンとどうやってインストールしたのか、なにをどうやって実行しているのかを質問に書きましょう。
kokono

2020/06/12 06:20

ありがとうございます。OSとPythonのバージョンを追記させていただきました。申し訳ありません、インストールについて正確に答えられているか分からないのですが、Pythonのオフィシャルサイトからのダウンロードで、使用しているのはIDLEです。Rosettaについては研究機関のHPからPythonファイル形式でダウンロードしました。
hope_mucci

2020/06/12 07:55

プログラムの入手方法、テストデータを用意する方法の詳細な説明を追記してください。 (件のプログラムを知らない回答者がテストできるようにするためです) 現状の文章ではRosettaが何なのかすらわかりません。研究機関とやらも何ぞや?です。
kokono

2020/06/14 02:03

ありがとうございます。Rosettaのプログラム入手方ですが、以下のアドレス(論文です)のページ下部、 Supplementary resource Rosetta3 code というところからダウンロードしました。ファイルを解凍し、プログラム、テストデータを得ました。 URL https://www.researchgate.net/publication/312491306_Weighted_Recalibration_of_the_Rosetta_Pedotransfer_Model_with_Improved_Estimates_of_Hydraulic_Parameter_Distributions_and_Summary_Statistics_Rosetta3
quickquip

2020/06/14 05:06

質問に書きましょう
guest

回答2

0

ベストアンサー

追記

Rpredict.pyに#tested on python 2.7と記載されおり、文字通りpython2系でしかうまく動作できません。
python3.xでは後述のsqlite型変換がうまくいかずエラーとなるようです。

※このプログラム自体は2001年に作成されたもののようです。python3.xで動かないのも納得。

python2系をインストールし、そちらの環境で実行してみてください。何も修正せずエラーなく実行できることを確認しました(python 2.7.17)

python 3.x で実行できない原因の推測

  • バイナリデータ(=文字列としてエンコードできるデータではない)が入っているblob型のann-binが変にTEXTとして推定されてしまいfetch時にエラーが発生する

ann-binは先頭数十バイト分がascii文字なので、これが原因でライブラリ側にTEXT型と推定されてしまっているのかもしれませんが、全く同じデータを別テーブルに入れてSELECTするとbytes扱いになったりするので条件がよくわかりません。

また、sqlite版のデータはMySQL版のDDLを雑に変換して投入しているようで、本来sqliteが持っている型情報と一致しません。このような部分もSELECT時の型の扱いを邪魔している可能性があります。
私もtext_factoryや処理中の型変換をいろいろいじってみましたが、解決策として紹介できるような有用な対策はありませんでした。
text_factory = bytesにして他のTEXT型の変数をひたすらbytesで動くように変更すれば統計の表示までは出るようになりましたが最終結果の出力まではできませんでした。

消極的な解決策ではありますがsqlite版はあきらめて同梱のMySQL版のデータを使用したほうがよろしいかと思います。

投稿2020/06/14 14:03

編集2020/06/14 22:34
hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2020/06/14 14:58 編集

コメントに str なのに # needed to get the binary data from sqlite と書かれてたので、python2.7 用のコードっぽいですね
hope_mucci

2020/06/14 22:25

コメントありがとうございます。Rpredict.pyに#tested on python 2.7 って書いてありました。Readme的なドキュメントに書いてくれればいいのに・・・
hope_mucci

2020/06/14 22:35

回答を改訂しました。python2.xで動かしてみてください。
kokono

2020/06/14 22:57

ありがとうございます、2.x環境で動かそうと思います。この度はありがとうございました。
guest

0

エラーから察するにann_binという列の値を読み出す際にbytes型をUTF-8にデコードできないことが原因に思います。文字コードは分かりますでしょうか?分かるのであれば、str関数の代わりにその文字コードに変換する関数を与えれば良い気がします。例えば文字コードがcp932の場合

python

1self.conn.text_factory = lambda b: b.decode('cp932')

でしょうか。入力がbytes型なのでいっそのこと

python

1self.conn.text_factory = bytes

とすれば動くような気がいたしますが、弊害は大きいかも知れません。

投稿2020/06/12 10:51

yymmt

総合スコア1615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokono

2020/06/14 02:04

ありがとうございます。こちらで実行してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問