Papouche Guinslyzinho
Papouche Guinslyzinho

Reputation: 5458

Sqlalchemy - how to fix '_sa_instance_state'

I have a folder containing over 200 000 json files. Each json object is a Tweet (twitter). I'm getting an error while saving a tweet into the db

#sqlalchemy_insert.py
def create_new_tweet(data, new_user):
    """
    insert new tweet into db
    """
    #tweet
    tweet_id = data.get('id')
    language = data.get('lang',  'en')
    tweet_text = data.get('text')
    in_reply_to_user = data.get('in_reply_to_user_id')
    coord = check_if_it_s_null(data.get('coordinates'))
    geo_location = check_if_it_s_null(data.get('geo'))
    created_at = parse(data.get('created_at'))
    try:
        new_tweet = Tweet(id=tweet_id, tweet=tweet_text,
                    lang=language,created_at=created_at,
                    geo=geo_location, coordinates=coord,
                    user=new_user)
        session.add(new_tweet)
    except:
        import ipdb; ipdb.set_trace()
    session.commit()
    return new_tweet

I'm getting an error on this line session.add(new_tweet)

ipdb> session.add(new_tweet)
*** AttributeError: 'Query' object has no attribute '_sa_instance_state'

I added a try to be able to debug but I have no clue how to insert this tweet to this db. this problem occurs after inserting the 153th tweet

complete gist - line 85

Upvotes: 4

Views: 15763

Answers (1)

r-m-n
r-m-n

Reputation: 15120

create_new_user returns Query object if user exists

new_user = session.query(User).filter(User.id == user_id) # it's a query

but you need to pass User object to create_new_tweet.

You can do something like this

def create_new_user(data):
    s_name = (data.get('user').get('screen_name'))
    user_name = (data.get('user').get('name'))
    user_id = (data.get('user').get('id'))
    new_user = session.query(User).filter(User.id == user_id).first() # it's a User object
    if new_user is None:
        new_user = User(id=user_id, name=user_name, screen_name=s_name)
        session.add(new_user)
        session.commit()
        #creating a profile
        create_new_profile(data, new_user)
    return new_user

Upvotes: 4

Related Questions