2017-04-11 1 views
1

ポニーORM(とpython3.5、sqlite3)を使っていくつかの基本的な演習を試してみてください。 私はそれ以上の処理をせずに、私が持っているいくつかのデータの選択クエリを印刷したいだけです。sqlite3 BLOBフィールドにpony ormを使用することはできません

from pony.orm import * 
db = Database() 
class File(db.Entity) : 
    _table_ = 'sums' 
    t = Required(str) 
    path = Required(bytes) 
    name = Required(bytes) 
    sum = Required(str) 
    PrimaryKey(path,name) 
db.bind('sqlite','/some/edited/path/test.db') 
db.generate_mapping() 

File.select().show() 
:ポニーのORMは、sqliteのDBをダンプここ

PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE sums (t text, path BLOB, name BLOB, sum text, primary key (path,name)); 
INSERT INTO "sums" VALUES('directory','','',''); 
INSERT INTO "sums" VALUES('file','','sums-backup-f.db','6859b35f9f026317c5df48932f9f2a91'); 
INSERT INTO "sums" VALUES('file','','md5-tree.py','c7af81d4aad9d00e88db7af950c264c2'); 
INSERT INTO "sums" VALUES('file','','test.db','a403e9b46e54d6ece851881a895b1953'); 
INSERT INTO "sums" VALUES('file','','sirius-alexa.db','22a20434cec550a83c675acd849002fa'); 
INSERT INTO "sums" VALUES('file','','sums-reseau-y.db','1021614f692b5d7bdeef2a45b6b1af5b'); 
INSERT INTO "sums" VALUES('file','','.md5-tree.py.swp','1c3c195b679e99ef18b3d46044f6e6c5'); 
INSERT INTO "sums" VALUES('file','','compare-md5.py','cfb4a5b3c7c4e62346aa5e1affef210a'); 
INSERT INTO "sums" VALUES('file','','charles.local.db','9c50689e8185e5a79fd9077c14636405'); 
COMMIT; 

は私がpython3.5対話型シェル上で実行しようとするコードがある

....ですべてのことを好きにいないようです

そして、それは次のように失敗します。

Traceback (most recent call last): 
    File "/usr/lib/python3.5/site-packages/pony/orm/core.py", line 5149, in _fetch 
    try: result = cache.query_results[query_key] 
KeyError: (('f', 0,()), (<pony.orm.ormtypes.SetType object at 0x7fd2d2701708>,), False, None, None, None, False, False, False,()) 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 2, in show 
    File "/usr/lib/python3.5/site-packages/pony/utils/utils.py", line 75, in cut_traceback 
    raise exc # Set "pony.options.CUT_TRACEBACK = False" to see full traceback 
    File "/usr/lib/python3.5/site-packages/pony/utils/utils.py", line 60, in cut_traceback 
    try: return func(*args, **kwargs) 
    File "/usr/lib/python3.5/site-packages/pony/orm/core.py", line 5256, in show 
    query._fetch().show(width) 
    File "/usr/lib/python3.5/site-packages/pony/orm/core.py", line 5155, in _fetch 
    used_attrs=translator.get_used_attrs()) 
    File "/usr/lib/python3.5/site-packages/pony/orm/core.py", line 3859, in _fetch_objects 
    real_entity_subclass, pkval, avdict = entity._parse_row_(row, attr_offsets) 
    File "/usr/lib/python3.5/site-packages/pony/orm/core.py", line 3889, in _parse_row_ 
    avdict[attr] = attr.parse_value(row, offsets) 
    File "/usr/lib/python3.5/site-packages/pony/orm/core.py", line 1922, in parse_value 
    val = attr.validate(row[offset], None, attr.entity, from_db=True) 
    File "/usr/lib/python3.5/site-packages/pony/orm/core.py", line 2218, in validate 
    val = Attribute.validate(attr, val, obj, entity, from_db) 
    File "/usr/lib/python3.5/site-packages/pony/orm/core.py", line 1894, in validate 
    if from_db: return converter.sql2py(val) 
    File "/usr/lib/python3.5/site-packages/pony/orm/dbapiprovider.py", line 619, in sql2py 
    if not isinstance(val, buffer): val = buffer(val) 
TypeError: string argument without an encoding 

私はこの間違ったを使用して、またはこれはバグであるだろうか?私はバグを記録しても構いませんが、このormを使うのは初めてです。だから、最初にチェックするほうがいいかもしれないと思っていました...

+0

なぜ最初にそれらの列にブロブを使用していますか? –

+0

私はこの質問が来るのではないかと心配していました...私はそれが話題ですが、好奇心のためにOSとロケールの異なるさまざまなマシンからのファイル名とパス...収穫時にユニコードの問題に遭遇しました時間をストリングと一緒に使うことができます。ポイントは:私はそれに固執して、私はsqlite3でそれを変換するか、またはポニーを使用して回避することができます(その両方を試してみてください、ありがとう)ポニーとの運動のために、私はブロブを抽出したい。 ... – caliloo

答えて

0

SQLiteは(ミス)列の型を無視して任意の値を格納します。厳密なデータ型ではなく、各SQLite列に親和性があり、各値には同じ列内で異なる記憶域クラスがあります。たとえば、テキスト値を整数列に格納することができます。逆もまた同様です。詳細については、Datatypes In SQLite Version 3を参照してください。

エラーの原因は、表にBLOB列に「間違った」型の値が含まれているためです。 SQLiteバイナリリテラルlooksx'abcdef'のように修正してください。使用するコマンドのINSERTでは、代わりにUTF8文字列を挿入します。

この問題は、GitHubから取れるlatest version of Ponyで多少修正されました。今度は、PonyがBLOB列から文字列値を受け取ると、例外をスローせずにその値を保持します。

テーブルをPonyに読み込むと、BLOBデータが正しいバイナリ値として書き込まれるため、問題なく後で読み込むことができます。

+0

本質的に私はブロブではないブロブを読むようにしていました。私の練習のために、私は実際のブロブにカラムを変換し、それは働いた。ありがとう! – caliloo

関連する問題