Python 3.6 с pony 0.7 выдает ошибку при коммите в oracle db - PullRequest
0 голосов
/ 29 декабря 2018

Я использую пони и питона с вышеупомянутыми версиями.Я пытаюсь выполнить вставку, ссылаясь на https://docs.ponyorm.com/firststeps.html

commit ()

выдает следующую ошибку:

ошибка типа:Тип: 'список'

Это происходит из:

obj2 = cache_index.setdefault(new_id, obj) in _save_created_

Это мой код:

from pony.orm import Database
from pony.orm import db_session
from pony.orm import commit 
from pony.orm import Required
from pony.orm import show
from pony.orm import Set
from pony.orm import set_sql_debug
from pony import orm
db = Database()

class Person(db.Entity):
    name = Required(str)
    age = Required(int)
    cars = Set('Car')

class Car(db.Entity):
    make = Required(str)
    model = Required(str)
    owner = Required(Person)

show(Person)

db.bind(provider='oracle',user='myuser',password='mypassword', 
dsn='localhost:1521/xe')
db.generate_mapping(create_tables=True)
set_sql_debug(True)
p1 = Person(name='John', age=20)
p2 = Person(name='Mary', age=22)
p3 = Person(name='Bob', age=30)
c1 = Car(make='Toyota', model='Prius', owner=p2)
c2 = Car(make='Ford', model='Explorer', owner=p3)
commit()

моя версия Python 3.6.1 имоя версия oracle - 11g Express Edition, выпуск 11.2.0.2.0 - 64-битная версия

И это полная обратная связь

p1 = Person(name='John', age=20)
p2 = Person(name='Mary', age=22)
p3 = Person(name='Bob', age=30)
c1 = Car(make='Toyota', model='Prius', owner=p2)
c2 = Car(make='Ford', model='Explorer', owner=p3)
commit()
GET CONNECTION
INSERT INTO "PERSON" ("NAME", "AGE") VALUES (:p1, :p2) RETURNING "ID" INTO :new_id
{'p1':'John', 'p2':20}

ROLLBACK
RELEASE CONNECTION
Traceback (most recent call last):

File "<ipython-input-5-d37ff54adaa6>", line 6, in <module>
commit()

File "<string>", line 2, in commit

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\utils\utils.py", line 78, in cut_traceback
reraise(exc_type, exc, full_tb)

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\utils\utils.py", line 95, in reraise
try: raise exc.with_traceback(tb)

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\utils\utils.py", line 61, in cut_traceback
try: return func(*args, **kwargs)

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\orm\core.py", line 337, in commit
rollback_and_reraise(sys.exc_info())

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\orm\core.py", line 326, in rollback_and_reraise
reraise(*exc_info)

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\utils\utils.py", line 95, in reraise
try: raise exc.with_traceback(tb)

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\orm\core.py", line 335, in commit
cache.flush()

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\orm\core.py", line 1797, in flush
if obj is not None: obj._save_()

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\orm\core.py", line 5090, in _save_
if status == 'created': obj._save_created_()

File "C:\ProgramData\Anaconda3\lib\site-packages\pony\orm\core.py", line 4943, in _save_created_
obj2 = cache_index.setdefault(new_id, obj)

TypeError: unhashable type: 'list'  

1 Ответ

0 голосов
/ 04 января 2019

Похоже, вы нажали эту ошибку в Pony ORM .

Эта ошибка, похоже, была исправлена ​​в исходном хранилище некоторое время в прошлом месяце, но в тот момент, когда я пишуэтот ответ, это исправление недоступно в релизе.Самым последним выпуском Pony ORM в настоящее время является версия 0.7.6, выпущенная в августе 2018 года.

Поскольку ошибка связана с серьезными изменениями в cx_Oracle 7, вам лучше всего понизить версию 6 до cx_Oracle.(У меня установлена ​​версия 6.3.1, которая, вероятно, объясняет, почему я не смог воспроизвести вашу ошибку.)

...