2013-10-09 3 views
0

У меня есть код написан на Python, используя SQLAlchemy.Как получить идентификатор недавно добавленного дочернего элемента в Python SQLAlchemy?

dailyCashFlow = models.DailyCashFlow(day=day, cash_start_of_day = cash_start_of_day, cash_end_of_day = cash_end_of_day)                         
    branch.dailyCashFlow.append(dailyCashFlow)                                             
    db.session.commit()                                                  

    result['result'] = True                                                 
    result['message'] = string.join(['Daily cashflow saved successfully with ID=#'], `dailyCashFlow.id`) 

Отношения примерно: company-> branches-> dailyCashflow. Я хочу получить идентификатор только что вставленного dailyCashFlow.id. Я думаю, что я могу легко вернуться к объекту dailyCashFlow, чтобы получить идентификатор, но это не так. В модели используется lazy = 'dynamic'. Это причина? И как я могу легко получить идентификатор вновь вставленных данных?

+0

Я не понимаю, когда вы говорите: «Я думаю, что могу легко вернуться к объекту dailyCashFlow, чтобы получить идентификатор, но это не так». Это не так? Если вы выполняете 'print dailyCashFlow.id' после фиксации, что вы получаете? –

+0

Это ничего не печатает. Пустой. Никто. Я уже знал, что, если я создам компанию (модель верхнего уровня), после фиксации базы данных, я получу новый идентификатор. Но в этом dailyCashFlow у меня не получилось. Хм .. может быть, мне пришлось перепроверить это :) – swdev

+0

, если dailyCashFlow имеет None для первичного ключа после завершения сеанса, то он не был вставлен. предполагая, что вы обычно обращаетесь к столбцу первичного ключа, а не заглядываете внутрь '__dict__' или что-то в этом роде. вы уверены, что «ветвь» является частью того же сеанса, и если да, то как выглядят сопоставления? – zzzeek

ответ

0

я вставил свое откровение к этому Questio

«Вы правы zzzeeek! Это тоже мое понимание, если вы осмотрите внимательно этот код, string.join ([ 'Daily денежный поток успешно сохранен с ID = # '], dailyCashFlow.id), вы увидите, что] вводится слишком рано. Это должно быть так: string.join ([«Ежедневный денежный поток успешно сохранен с ID = #», dailyCashFlow.id)]. Я получаю хороший опыт, почему модульный тест является обязательным. :). Если вы хотите переместить свой ответ в раздел вопросов, я с радостью принимаю его как принятый ответ. »

Так что посетитель этой страницы будет знать, что я сделал неправильно;)

1

У вашего среднего значения есть идентификатор вставляемых данных?

result = tb_conn.insert().execute(data) 
id = result.inserted_primary_key[0] 
+0

Я не думаю, что это код SQLAlchemy :) – swdev

+2

Это так, но он использует API выражения SQLAlchemy, а не API декларативных запросов ORM. –

+0

Ааа, простите за мой невежественный ответ. Хм, но я хочу использовать простой декларативный способ. Похоже, если я использую выражение API (которого у меня нет, поскольку я новичок в этой области), я не получу большой пользы. Или, может быть, это просто мое подобие;) – swdev

Смежные вопросы