2011-03-01 2 views
2

В sqlite3 в python я пытаюсь создать программу, в которую будет добавлена ​​новая строка в таблице, которая будет записана, должна быть распечатана. Но я просто прочитал documentation here, что INSERT следует использовать в выражении execute(). Проблема в том, что программа, которую я запрашиваю у пользователя для его/ее информации, и идентификатор первичного ключа будет назначен для члена, так как его идентификационный номер должен быть отображен. Иными словами, оператор execute («INSERT») не должен выполняться первым, поскольку идентификационные ключи были бы неправильными для назначения элемента.lastrowid() альтернатива или синтаксис без использования execute в sqlite python?

Сначала я подумал, что lastrowid можно запустить без использования execute («INSERT»), но я заметил, что он всегда давал мне значение «None». Затем я прочитал документацию в sqlite3 в python и googled альтернативах для решения этой проблемы.

Я читал через google где-то, что можно использовать SELECT last_insert_rowid(), но было бы хорошо спросить, что является синтаксисом этого в python? Я попытался кодирования его, как этот

NextID = con.execute("select last_insert_rowid()") 

Но это только дало мне курсор вывода объекта «»

Я также думал просто сделать еще одну таблицу, где будет всегда только быть одно значение. Он получит значение lastrowid основной таблицы всякий раз, когда в основной таблице будет введен новый ввод данных. Затем полученное значение будет вставлено и перезаписано в другой таблице, так что каждый раз, когда в основной таблице должен быть введен новый набор данных, и требуется следующий идентификатор строки, он просто получит доступ к таблице с этим значением ,

Или есть альтернативный и более простой способ сделать это?

Любая помощь очень ценится луки глубоко

+0

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

+0

@btilly - Было бы хорошо спросить, как сделать его помеченным как «не включен», пожалуйста? Итак, вы говорите, что когда все данные будут добавлены, сначала удаляются первые данные? Извините, я не уверен, что я совсем понимаю ^^ ;; – hyoumoku

+0

Я имею в виду, что у вас будет поле в строке, которое во всех ваших запросах вы будете фильтровать, чтобы сказать: «Игнорируйте это». Это начинается в состоянии игнорирования, а затем вы переворачиваете его, когда закончите. Если сменить другие запросы слишком сложно, вы всегда можете иметь 2 таблицы. Сначала вы вставляете файл с идентификатором первичного ключа. А затем вы копируете готовые данные в другой, который не пытается создать идентификатор первичного ключа.Это расточительно, но может быть проще реализовать. – btilly

ответ

2

Вы можете угадатьследующий ID, если бы запросить таблицу , прежде чем спрашивать пользователя за его/ее информации с SELECT MAX(ID) + 1 as NewID FROM DesiredTable.

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

0

Спасибо за ответы и предложения размещено все, но я в конечном итоге делаю что-то вроде этого:

#only to get the value of NextID to display 
TempNick = "ThisIsADummyNickToBeDeleted"   
cur.execute("insert into Members (Nick) values (?)", (TempNick,)) 
NextID = cur.lastrowid 
cur.execute("delete from Members where ID = ?", (NextID,)) 

Так в основном, для того, чтобы получить lastrowid, я заканчивал вставки фиктивных данных, то после получения значения от последней, фиктивные данные будут удалены.

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