2013-05-07 37 views
1

我试图将行插入,它有三个表的数据库:插入新的一对多的数据插入表与SQLAlchemy的ORM

  • 艺术家
  • 歌曲
  • 媒体(如YouTube的视频)

艺术家与歌曲和歌曲有一对多的关系,与媒体有一对多的关系。当艺术家,歌曲和媒体是新的并需要添加到数据库的情况下,我会陷入困境。

我想我可以添加艺术家,提交它,然后检索艺术家对象,然后用艺术家对象添加的歌曲,运用同样的想法歌曲>媒体。但是,这似乎并不是最有效的方法。

我尝试添加的每个对象首次然后commiting底:

new_artist = models.Artist(
    name = artist_name, 
    ) 
db.session.add(artist) 

new_song = models.Song(
    name = song_name, 
    artist = artist, 
    ) 
db.session.add(song) 

new_media = models.Media(
    song = song, 
    media_id = media_id, 
    user=user 
    ) 
db.session.add(media) 
db.session.commit() 

但我发现了这个错误:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/path/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 114, in do 
    return getattr(self.registry(), name)(*args, **kwargs) 
    File "/path/python2.7/site-packages/sqlalchemy/orm/session.py", line 703, in commit 
    self.transaction.commit() 
    File "/path/python2.7/site-packages/sqlalchemy/orm/session.py", line 361, in commit 
    self._prepare_impl() 
    File "/path/python2.7/site-packages/sqlalchemy/orm/session.py", line 340, in _prepare_impl 
    self.session.flush() 
    File "/path/python2.7/site-packages/sqlalchemy/orm/session.py", line 1718, in flush 
    self._flush(objects) 
    File "/path/python2.7/site-packages/sqlalchemy/orm/session.py", line 1789, in _flush 
    flush_context.execute() 
    File "/path/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 331, in execute 
    rec.execute(self) 
    File "/path/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 475, in execute 
    uow 
    File "/path/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 64, in save_obj 
    table, insert) 
    File "/path/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 558, in _emit_insert_statements 
    execute(statement, params) 
    File "/path/python2.7/site-packages/sqlalchemy/engine/base.py", line 1449, in execute 
    params) 
    File "/path/python2.7/site-packages/sqlalchemy/engine/base.py", line 1584, in _execute_clauseelement 
    compiled_sql, distilled_params 
    File "/path/python2.7/site-packages/sqlalchemy/engine/base.py", line 1698, in _execute_context 
    context) 
    File "/path/python2.7/site-packages/sqlalchemy/engine/base.py", line 1691, in _execute_context 
    context) 
    File "/path/python2.7/site-packages/sqlalchemy/engine/default.py", line 331, in do_execute 
    cursor.execute(statement, parameters) 
sqlalchemy.exc.InterfaceError 

我如何能做到这一点任何想法?

回答

2

你能试试这个,让我知道你想说什么?

基本上,我只是把正确的参考变量。

new_artist = models.Artist(
    name = artist_name, 
    ) 
db.session.add(new_artist) 

new_song = models.Song(
    name = song_name, 
    artist = new_artist, 
    ) 
db.session.add(new_song) 

new_media = models.Media(
    song = new_song, 
    media_id = media_id, 
    user=user 
    ) 
db.session.add(new_media) 
db.session.commit() 
+0

我以为我按照上面的方式实现了它,但我必须在我的代码中出现拼写错误。我只是重写了一切,现在看起来工作正常! – Cass 2013-05-08 01:36:14

+0

当我这样做时,会抛出一个'IntegrityError',因为'new_artist'返回的值是'__repr__'方法返回的值,而不是它的'id'。我如何解决这个问题? – Kevin 2014-06-10 17:33:13