2017-04-11 4 views
1

조랑말 ORM (및 python3.5, sqlite3)을 사용하여 기본적인 연습을 해보십시오. 나는 더 이상 처리하지 않고 가지고있는 일부 데이터의 선택 쿼리를 인쇄하고 싶습니다. 조랑말 ORM은 .... 전혀 것을 좋아하지 않는 것 sqlite3 blob 필드에 pony 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 대화 형 쉘에서 실행하려고 코드입니다 :

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() 

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는 (mis) 기능을 가지고 있습니다. 열 유형을 무시하고 임의의 값을 저장하는 열. 엄격한 데이터 유형 대신 각 SQLite 열은 선호도를 가지며 각 값은 동일한 열에서 다를 수있는 저장 클래스를가집니다. 예를 들어 정수 값 열에 텍스트 값을 저장할 수 있으며 그 반대의 경우도 가능합니다. 자세한 내용은 Datatypes In SQLite Version 3을 참조하십시오.

오류의 원인은 테이블에 BLOB 열에 "잘못된"값이 들어 있기 때문입니다. 올바른 SQLite 이진 리터럴 looksx'abcdef'입니다. INSERT 명령은 대신 UTF8 문자열을 삽입합니다.

이 문제는 GitHub에서 가져올 수있는 latest version of Pony에 다소 수정되었습니다. 이제 Pony가 BLOB 열에서 문자열 값을 받으면 예외를 throw하지 않고 해당 값을 유지합니다.

테이블을 Pony로 채우면 BLOB 데이터가 올바른 이진 값으로 기록되므로 문제없이 나중에 읽을 수 있습니다.

+0

사실 본질적으로 나는 방울이 아니었던 방울을 읽으려고했습니다. 제 운동을 위해서 저는 기둥을 실제 얼룩으로 바꾸었고 효과가있었습니다. 감사 ! – caliloo