2012-02-25 3 views
1

플라스크에 Flask 및 SQLAlchemy가 시작되었습니다.Flask 관계 모델 여러 개 존재하지 않을 경우 생성 또는 생성

여기 예제를 사용하여 다 대 다 관계가 있습니다 http://docs.sqlalchemy.org/en/latest/orm/tutorial.html 키워드 및 태그에 대한 부분으로 스크롤하면이 작업이 진행됩니다. 지금까지 내 글과 관련된 새 키워드를 삽입 할 수 있었고 추가 기능을 사용하고 있습니다. 내가 아는 것은 잘못된 것입니다. 따라서 다음 번에 고유하지 않은 키워드가 블로그 게시물에 발생하면 키워드와의 충돌에 대한 오류가 발생합니다 (키워드는 고유해야하기 때문에 키워드는 0120). 무엇을 모르겠다. 나는 get_or_create (키워드)의 예를 보았는데, 기본적으로 키워드별로 필터링 한 다음 찾지 못하면 추가합니다. 그러나 나는 데이터 크기가 커짐에 따라 이것이 또한 틀릴 것이라고 믿는다. (한 번의 삽입으로 모든 저장시 여러 번 통화). SQLAlchemy가 자동으로 여러 개의 삽입 작업을하는 방식을 좋아합니다. 나는 이것을 지키고 싶지만이 중복 키 문제는 피하십시오.

편집 : SQLAlchemy docs가 오류에 대한 해결책을 찾았지만 설명이 나와 있습니다. 나는 답을 추가했다.

+0

btw 관련 모델에 append를 사용하고 있습니다. 이렇게. post.keywords.append (Keyword ("foo")) 그런 다음 commit을 호출합니다. – Vangel

+0

모델을 게시하고 실제 코드를 추가 할 수 있습니까? – plaes

+0

게시물을 업데이트했습니다. 나는 분명히 아무것도하지 않을 merge()와 같은 것을 시도하고 아무것도하지 않는다. 두 번째 페이지로드로 인해 항상 오류가 발생합니다. Game 테이블에 존재하지 않는 게임 (태그)과 usergames (존재하지 않는 경우)를 추가하고 싶습니다. Ofcourse 나는 그것이 게임이 아닌 usergames에있는 게임을 가지고 있습니다. 그 부분은 문제 없습니다. merge()가 (와) 만 처리하기 때문에 Tag()가 기본 키로 문자열 내용 "a1", "a2"즉 자연적인 기본 키를 가진 경우에만 Game() – Vangel

답변

2

몇 시간 동안 시행 착오를 거친 후에도 해결책을 찾았으며 일을 더 잘하고 있습니다.

이것은 SQL 연금술의 작동 방식입니다. 대답은 병합입니다.

태그 목록을 태그 모델로 만들려면 기본 키가 이름이거나 고유 한 것이면 문제가되지 않습니다.

tags = [Tag('a1'),Tag('a2')] 

이미 DB에 태그 a1이 있지만 실제로는 신경 쓰지 않는다고 가정 해보십시오. 우리가 원하는 것은 관련된 데이터가 존재하지 않는다면 삽입하는 것뿐입니다. SQLalchemy는 무엇을합니다. 이제 우리가 만든 모든 태그 목록으로 게시물을 만듭니다. 하나만있는 경우 목록이기도합니다.

그러므로

내가 플라스크 구문을 사용했다
new_post = Post('a great new post',post_tags=tags) 
db.session.merge(new_post) 
db.session.commit() 

하지만 아이디어는 동일합니다. 세션 밖에서 모델을 만들지 않도록하십시오. 더 가능성이 높습니다, 당신은 그것을하지 않을 것입니다.

이것은 실제로 간단하지만 SQLAlchemy 문서에서는 아무 것도 언급되지 않았습니다. 그들은 잘못된 append()를 사용합니다. 당신이 중복을 만들지 않는다는 것을 알고있는 새로운 꼬리표를 창조하는 것은 단지이다.

희망이 있습니다.

+2

merge()가 적합합니다. 기본 키. 좀 더 일반적인 "X 고유의 객체"는 http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject에 있습니다.이 내용은 튜토리얼의 범위를 벗어납니다. 튜토리얼에서 "append()"의 사용법은 "잘못"이 아니며, 다 - 대다 관계가 작동하는 방법을 보여줍니다. merge()는 키워드에 surrogate pk가 있기 때문에 자습서 예제에서 작동하지 않습니다. – zzzeek

관련 문제