перегонный куб и получение последнего вставленного значения

Я использую перегонный куб для управления структурой моей базы данных.

После добавления таблицы с использованием идентификатора в качестве целого числа и первичного ключа столбец идентификатора будет столбцом с автоинкрементом. Как мне запросить данные в сценарии обновления, чтобы я был уверен, что получу правильный идентификатор (в данном конкретном случае я знаю, что это 1)?

я знаю как

#creating the table
op.create_table(
    'srv_feed_return_type',
    sa.Column('id', sa.Integer, primary_key=True),
    sa.Column('name', sa.String(50), nullable=False),
    sa.Column('created', sa.DateTime, server_default=func.now(), nullable=False),
    sa.Column('created_by', sa.String(50), nullable=False),
    sa.Column('last_updated', sa.DateTime, nullable=False),
    sa.Column('last_updated_by', sa.String(50), nullable=False)
)

#table for operations
srv_feed_return_type = table('srv_feed_return_type',
                             column('name'),
                             column('created'),
                             column('created_by'),
                             column('last_updated'),
                             column('last_updated_by'))

#bulk insert
op.bulk_insert(srv_feed_return_type,
               [
                   {'name': 'dataset',
                    'created': datetime.now(), 'created_by': 'Asken',
                    'last_updated': datetime.now(), 'last_updated_by': 'Asken'}
               ])

Я знаю, что могу выполнить обновление, но как мне сделать выбор, используя что-то подобное, как показано ниже?

op.execute(
    srv_feed_return_type.update().\
        where(srv_feed_return_type.c.name==op.inline_literal('dataset')).\
        values({'name':op.inline_literal('somethingelse')})
        )

person Asken    schedule 21.03.2013    source источник
comment
Можно ли предположить, что никакие другие процессы не изменят вашу вновь созданную таблицу, пока миграция не будет завершена?   -  person vvladymyrov    schedule 21.03.2013
comment
для этого примера да, но я знаю, что это будет здесь. в другой миграции это уже не будет 1. мне нужно знать идентификатор определенного возвращаемого типа.   -  person Asken    schedule 21.03.2013
comment
Какую базу данных вы используете для своего приложения и есть ли возможность использовать другую базу данных - есть ли требование, чтобы приложение не зависело от базы данных?   -  person vvladymyrov    schedule 21.03.2013


Ответы (1)


Сначала, чтобы иметь столбец с автоинкрементом, вам нужно изменить определение схемы таблицы, чтобы последовательность передавалась для столбца первичного ключа: sa.Column('id', sa.Integer, Sequence('srv_feed_r_t_seq'),primary_key=True),

#creating the table
op.create_table(
    'srv_feed_return_type',
    sa.Column('id', sa.Integer, Sequence('srv_feed_r_t_seq'),primary_key=True),
    sa.Column('name', sa.String(50), nullable=False),
    sa.Column('created', sa.DateTime, server_default=func.now(), nullable=False),
    sa.Column('created_by', sa.String(50), nullable=False),
    sa.Column('last_updated', sa.DateTime, nullable=False),
    sa.Column('last_updated_by', sa.String(50), nullable=False)
)

Теперь о том, как получить PK id:

op.execute и op.bulk_insert не возвращают вам никаких результатов. Но вы можете получить то же соединение, которое используется для этих операций.

После выполнения bulk_insert или execute(table.update ...) вы можете запустить запрос на выборку в том же контексте и получить идентификатор PK для интересующей записи:

connection = op.get_bind()
r = connection.execute(srv_feed_return_type.select().where(...))
for row in r:
    pk_id = r['id']
    """or something more sophisticated"""

Вам нужно будет указать правильный фильтр в предложении where, чтобы убедиться, что вы идентифицировали запись, которую вы недавно изменили, уникальным образом.

Вот пример аналогичной функциональности, но с жестко заданными запросами на выборку

person vvladymyrov    schedule 21.03.2013
comment
Попытаюсь. Спасибо! Кстати, определив Integer и primary_key=True, он автоматически будет автоматически увеличиваться. - person Asken; 21.03.2013
comment
Спасибо за подсказку об автоматическом автоинкременте. У меня это не сработало, когда я использовал Oracle, поэтому мне пришлось явно использовать последовательность - person vvladymyrov; 22.03.2013
comment
Может быть, это по-другому для Oracle... может быть, я должен добавить его в свой код, чтобы быть в безопасности. - person Asken; 22.03.2013