JoeGermuska / birdnest

A little project around our JQBX group
birdnest.vercel.app
MIT License
1 stars 0 forks source link

Can't replace tracks in an existing playlist #7

Open JoeGermuska opened 3 years ago

JoeGermuska commented 3 years ago

A playlist had a track repeated because of a JQBX error. I wanted to remove the duplicate using python code, and when I tried to assign a revised list of Track objects to the playlist, I got this error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-4c8132f09bb0> in <module>
----> 1 p.tracks = nt

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/ext/associationproxy.py in __set__(self, obj, values)
    200     def __set__(self, obj, values):
    201         class_ = type(obj)
--> 202         return self._as_instance(class_, obj).set(obj, values)
    203 
    204     def __delete__(self, obj):

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/ext/associationproxy.py in set(self, obj, values)
    584             assert self.collection_class is not None
    585             if proxy is not values:
--> 586                 proxy._bulk_replace(self, values)
    587 
    588     def delete(self, obj):

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/ext/associationproxy.py in _bulk_replace(self, assoc_proxy, values)
    992     def _bulk_replace(self, assoc_proxy, values):
    993         self.clear()
--> 994         assoc_proxy._set(self, values)
    995 
    996 

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/ext/associationproxy.py in _set(self, proxy, values)
    648             self.parent.proxy_bulk_set(proxy, values)
    649         elif self.collection_class is list:
--> 650             proxy.extend(values)
    651         elif self.collection_class is dict:
    652             proxy.update(values)

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/ext/associationproxy.py in extend(self, values)
   1092     def extend(self, values):
   1093         for v in values:
-> 1094             self.append(v)
   1095 
   1096     def insert(self, index, value):

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/ext/associationproxy.py in append(self, value)
   1077     def append(self, value):
   1078         col = self.col
-> 1079         item = self._create(value)
   1080         col.append(item)
   1081 

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/ext/associationproxy.py in _create(self, value)
    999 
   1000     def _create(self, value):
-> 1001         return self.creator(value)
   1002 
   1003     def _get(self, object_):

TypeError: __init__() takes 1 positional argument but 2 were given

It's a rare use-case, but solving it might help understand AssociationProxy better.

JoeGermuska commented 3 years ago

Possibly related: I can't delete that playlist either.

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-11-e14270c84dac> in <module>
      1 session.delete(p)
----> 2 session.commit()

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/session.py in commit(self)
   1413                 raise sa_exc.InvalidRequestError("No transaction is begun.")
   1414 
-> 1415         self._transaction.commit(_to_root=self.future)
   1416 
   1417     def prepare(self):

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/session.py in commit(self, _to_root)
    827         self._assert_active(prepared_ok=True)
    828         if self._state is not PREPARED:
--> 829             self._prepare_impl()
    830 
    831         if self._parent is None or self.nested:

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/session.py in _prepare_impl(self)
    806                 if self.session._is_clean():
    807                     break
--> 808                 self.session.flush()
    809             else:
    810                 raise exc.FlushError(

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/session.py in flush(self, objects)
   3231         try:
   3232             self._flushing = True
-> 3233             self._flush(objects)
   3234         finally:
   3235             self._flushing = False

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/session.py in _flush(self, objects)
   3371         except:
   3372             with util.safe_reraise():
-> 3373                 transaction.rollback(_capture_exception=True)
   3374 
   3375     def bulk_save_objects(

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py in __exit__(self, type_, value, traceback)
     68             self._exc_info = None  # remove potential circular references
     69             if not self.warn_only:
---> 70                 compat.raise_(
     71                     exc_value,
     72                     with_traceback=exc_tb,

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/util/compat.py in raise_(***failed resolving arguments***)
    196 
    197         try:
--> 198             raise exception
    199         finally:
    200             # credit to

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/session.py in _flush(self, objects)
   3331             self._warn_on_events = True
   3332             try:
-> 3333                 flush_context.execute()
   3334             finally:
   3335                 self._warn_on_events = False

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py in execute(self)
    451         else:
    452             for rec in topological.sort(self.dependencies, postsort_actions):
--> 453                 rec.execute(self)
    454 
    455     def finalize_flush_changes(self):

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py in execute(self, uow)
    572         states = self._elements(uow)
    573         if self.isdelete:
--> 574             self.dependency_processor.process_deletes(uow, states)
    575         else:
    576             self.dependency_processor.process_saves(uow, states)

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/dependency.py in process_deletes(self, uowcommit, states)
    550                         ):
    551                             if child is not None:
--> 552                                 self._synchronize(
    553                                     state, child, None, True, uowcommit, False
    554                                 )

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/dependency.py in _synchronize(self, state, child, associationrow, clearkeys, uowcommit, pks_changed)
    608             return
    609         if clearkeys:
--> 610             sync.clear(dest, self.mapper, self.prop.synchronize_pairs)
    611         else:
    612             sync.populate(

~/.virtualenvs/birdnest-QUrl1afS/lib/python3.8/site-packages/sqlalchemy/orm/sync.py in clear(dest, dest_mapper, synchronize_pairs)
     84         ):
     85 
---> 86             raise AssertionError(
     87                 "Dependency rule tried to blank-out primary key "
     88                 "column '%s' on instance '%s'" % (r, orm_util.state_str(dest))

AssertionError: Dependency rule tried to blank-out primary key column 'playlist_track.playlist_id' on instance '<PlaylistTrack at 0x1075e5850>'