Re: [sqlalchemy] mapping a class linked with two other classes (AttributeError: 'str' object has no attribute '_sa_instance_state')

2011-06-16 Thread Jules Stevenson
Ack, ignore :). There was no direct relationship to the user at all,
doh. So I'm passing that into the ArkUserContactGUID construction, and
all works well.

Thanks again for the help, much appreciated.

Jules

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.



Re: [sqlalchemy] mapping a class linked with two other classes (AttributeError: 'str' object has no attribute '_sa_instance_state')

2011-06-16 Thread Jules Stevenson
Hi Simon, thank you very much for your help (again!), and yes, that's
how I'm using the mapping :).

I'm now getting an SQL error, I think because the user is not being
pulled automatically through when trying to add the
ArkUserContactGUID:

OperationalError: (OperationalError) (1364, "Field 'user_id' doesn't
have a default value") 'INSERT INTO `user_contact_UID_table`
(contact_id, uid) VALUES (%s, %s)' (2L,
'http://www.google.com/m8/feeds/contacts/jules%40kettlestudio.co.uk/base/7c5456c108b2111b')

File 'C:\\ark\\ark\\controllers\\contacts.py', line 368 in initial_sync
  contact_sync.initial_sync()
File 'C:\\ark\\ark\\arkTools\\arkGoogle.py', line 121 in initial_sync
  self.add_contact_to_google(contact)
File 'C:\\ark\\ark\\arkTools\\arkGoogle.py', line 263 in add_contact_to_google
  meta.Session.commit()
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\scoping.py',
line 113 in do
  return getattr(self.registry(), name)(*args, **kwargs)
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\session.py',
line 617 in commit
  self.transaction.commit()
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\session.py',
line 293 in commit
  self._prepare_impl()
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\session.py',
line 277 in _prepare_impl
  self.session.flush()
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\session.py',
line 1473 in flush
  self._flush(objects)
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\session.py',
line 1542 in _flush
  flush_context.execute()
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\unitofwork.py',
line 327 in execute
  rec.execute(self)
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\unitofwork.py',
line 471 in execute
  uow
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\orm\\mapper.py',
line 2163 in _save_obj
  execute(statement, params)
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\engine\\base.py',
line 1358 in execute
  params)
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\engine\\base.py',
line 1491 in _execute_clauseelement
  compiled_sql, distilled_params
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\engine\\base.py',
line 1599 in _execute_context
  context)
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\engine\\base.py',
line 1592 in _execute_context
  context)
File 
'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-py2.6.egg\\sqlalchemy\\engine\\default.py',
line 325 in do_execute
  cursor.execute(statement, parameters)
File 'C:\\ark\\env_x64\\lib\\site-packages\\MySQLdb\\cursors.py', line
173 in execute
  self.errorhandler(self, exc, value)
File 'C:\\ark\\env_x64\\lib\\site-packages\\MySQLdb\\connections.py',
line 36 in defaulterrorhandler
  raise errorclass, errorvalue
OperationalError: (OperationalError) (1364, "Field 'user_id' doesn't
have a default value") 'INSERT INTO `user_contact_UID_table`
(contact_id, uid) VALUES (%s, %s)' (2L,
'http://www.google.com/m8/feeds/contacts/jules%40kettlestudio.co.uk/base/7c5456c108b2111b')

I think this is because the contacts object uses a many to many
relationship (a contact can belong to any or all users), code as
follows:

# ArkContact - clientprojectshot module
orm.mapper(ArkContact, contacts_table, properties={
'notes': orm.relation(ArkNote,
secondary=contact_notes_table,
backref='contacts',
single_parent=True,
cascade="all, delete, delete-orphan"),
'users': orm.relation(ArkUser,
secondary=user_contact_table,
backref='contacts'),
'google_UID': orm.relation(ArkUserContactGUID,
cascade="all, delete",
uselist=False,
backref='user')
})


I'm thinking I should join between the user and ArkUserContactGUID
somehow, but don't know how...

Many thanks,

Jules

On Thu, Jun 16, 2011 at 2:04 PM, King Simon-NFHD78
 wrote:
>> -Original Message-
>> From: sqlalchemy@googlegroups.com [mailto:sqlalchemy@googlegroups.com]
>> On Behalf Of Jules Stevenson
>> Sent: 16 June 2011 08:44
>> To: sqlalchemy@googlegroups.com
>> Subject: [sqlalchemy] mapping a class linked with two other classes
>> (AttributeError: 'str' object has no attribute '_sa_instance_state')
>>
>> Hi List,
>>
>> I have a user class, a contact class, and a googleID class.
>>
>> the contact class has can have a googleID per user in the system. I'm
>> trying to map it out as follows:
>>
>> # ArkContact - clientprojectshot module
>> orm.mapper(ArkContact, contacts_table, properties={
>>     'notes': orm.relation(ArkNote,
>>             sec

RE: [sqlalchemy] mapping a class linked with two other classes (AttributeError: 'str' object has no attribute '_sa_instance_state')

2011-06-16 Thread King Simon-NFHD78
> -Original Message-
> From: sqlalchemy@googlegroups.com [mailto:sqlalchemy@googlegroups.com]
> On Behalf Of Jules Stevenson
> Sent: 16 June 2011 08:44
> To: sqlalchemy@googlegroups.com
> Subject: [sqlalchemy] mapping a class linked with two other classes
> (AttributeError: 'str' object has no attribute '_sa_instance_state')
> 
> Hi List,
> 
> I have a user class, a contact class, and a googleID class.
> 
> the contact class has can have a googleID per user in the system. I'm
> trying to map it out as follows:
> 
> # ArkContact - clientprojectshot module
> orm.mapper(ArkContact, contacts_table, properties={
> 'notes': orm.relation(ArkNote,
> secondary=contact_notes_table,
> backref='contacts',
> single_parent=True,
> cascade="all, delete, delete-orphan"),
> 'users': orm.relation(ArkUser,
> secondary=user_contact_table,
> backref='contacts'),
> 'google_UID': orm.relation(ArkUserContactGUID,
> cascade="all, delete",
> backref='user')
> })
> 
> #user contact google_GUID
> user_contact_UID = sa.Table('user_contact_UID_table', meta.metadata,
> sa.Column('user_id', sa.types.Integer, sa.ForeignKey('users.id'),
> primary_key=True),
> sa.Column('contact_id', sa.types.Integer,
> sa.ForeignKey('contacts.id'), primary_key=True),
> sa.Column('google_UID', sa.types.String(length = 1024))
> )
> 
> class ArkUserContactGUID(object):
> def __init__(self):
> pass
> 
> orm.mapper(ArkUserContactGUID, user_contact_UID)
> 
> This raises two issues, the first is that an instrumented list is
> returned for the google_UID paramter on the contact object, whereas
> there should only ever be one (since as an operator there is only
> ever
> one user signed in - you).
> 

For one-to-one relationships, you should supply "uselist=False" to your
relationship:

http://www.sqlalchemy.org/docs/orm/relationships.html#one-to-one


> The second is it outright errors :), presumably because my mapping is
> off:
> 
> File 'C:\\ark\\ark\\controllers\\contacts.py', line 368 in
> initial_sync
>   contact_sync.initial_sync()
> File 'C:\\ark\\ark\\arkTools\\arkGoogle.py', line 121 in initial_sync
>   self.add_contact_to_google(contact)
> File 'C:\\ark\\ark\\arkTools\\arkGoogle.py', line 259 in
> add_contact_to_google
>   data.google_UID.append(entry.get_id())
> File 'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-
> py2.6.egg\\sqlalchemy\\orm\\collections.py',
> line 952 in append
>   item = __set(self, item, _sa_initiator)
> File 'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-
> py2.6.egg\\sqlalchemy\\orm\\collections.py',
> line 927 in __set
>   item = getattr(executor, 'fire_append_event')(item, _sa_initiator)
> File 'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-
> py2.6.egg\\sqlalchemy\\orm\\collections.py',
> line 618 in fire_append_event
>   item, initiator)
> File 'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-
> py2.6.egg\\sqlalchemy\\orm\\attributes.py',
> line 741 in fire_append_event
>   value = fn(state, value, initiator or self)
> File 'C:\\ark\\env_x64\\lib\\site-packages\\sqlalchemy-0.7.1-
> py2.6.egg\\sqlalchemy\\orm\\unitofwork.py',
> line 35 in append
>   item_state = attributes.instance_state(item)
> AttributeError: 'str' object has no attribute '_sa_instance_state'
> 
> Many thanks for any help!
> 
> Jules

You're passing a string (presumably the result of entry.get_id()) where
SA is expecting an instance of a mapped class. I haven't looked at your
mapping in detail, but rather than this:

  data.google_UID.append(entry.get_id())

you probably want something like this:

  obj = ArkUserContactGUID(google_UID=entry.get_id())
  data.google_UID.append(obj)

(If I've misunderstood your mapping, these class names are probably
wrong)

Hope that helps,

Simon

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.