Форум сайта python.su
0
спасибо всем кто откликнулся на мой предыдущий вопрос, но возник новый
Итак, есть
cursor.execute(“”“ INSERT INTO user () VALUES ()”“”, )
это работает коректно, таблица заполняется, но…
user_id есть AUTO_INCREMENT
потому я его ка бы не знаю
теперь проблема
мне надо вытянуть в какую нить переменнуй последний user_id
если сделать
tt = cursor.execute(“”“SELECT MAX(user_id) FROM (user)”“”)
tr = cursor.execute(“”“SELECT `user_id` FROM `user` ORDER BY `user_id` DESC LIMIT 1”“”)
print tt, rt
то выводит 1 1
а если
DECLARE @tt integer;
SELECT @tt:=MAX(user_id) FROM `user`;
SELECT `user_id` FROM `user` ORDER BY `user_id` DESC LIMIT 1
выводят правильно 32
Где ошибка?
Заранее спасибо )))
Отредактировано tadej (Дек. 27, 2014 23:10:05)
Офлайн
72
Начнем с того, что по PEP 249 значение возвращаемое execute не определено (хотя в вашем случае это похоже число возвращенных строк, но полагаться на это не следует). чтобы получить результат запроса надо вызвать cursor.fetchone()(ну или fetchmany. fetchall и т.д.)
Далее, получать последний id через max не следует, представьте что пишут в базу хотя бы два потока.
Для получения последнего вставленного id у курсора есть свойство Cursor .lastrowid хотя тут зависит от базы данных и библиотеки доступа, поскольку свойство это опционально.
Отредактировано PooH (Дек. 28, 2014 11:45:45)
Офлайн
0
Спасибо, но
PooHв конкретном случае поток один, и последний (максимальный) ИД бутет тот что записан в предыдущей строчки програми. (в даном случае, это регистрация пользователя)
Далее, получать последний id через max не следует, представьте что пишут в базу хотя бы два потока.
PooHШас будем разбиратся ))))
Для получения последнего вставленного id у курсора есть свойство Cursor .lastrowid хотя тут зависит от базы данных и библиотеки доступа, поскольку свойство это опционально.
Отредактировано tadej (Дек. 28, 2014 13:03:07)
Офлайн
72
tadejРегистрация пользователя? Не веб ли это приложение? Тогда там никак не один поток.
в конкретном случае поток один, и последний (максимальный) ИД бутет тот что записан в предыдущей строчки програми. (в даном случае, это регистрация пользователя)
tadejВы не сказали что у вас MySQL. Рекомендую все же пользоваться .lastrowid - он описан в DB API, т.е. стандартен, хотя и не реализован для некоторых библиотек, в частности для MSSQL через pypyodbc, а insert_id чисто мускульная приблуда.
Спасибо за совет, но оказывается есть намного проще вариант
con.insert_id() – Возвращает ID, сгенерированный для столбца AUTO_INCREMENT предыдущим запросом
Офлайн
0
PooHПочему?
Тогда там никак не один поток.
Офлайн
72
tadejПотому что веб-приложение обычно запускается в несколько потоков, чтобы пользователи могли работать с ним одновременно(про асинхронные библиотеки помним, но тут умалчиваем).
PooH
Тогда там никак не один поток.
Почему?
Пока не пройдет весь цикл регистрации, следующий пользователь не зарегится.
Офлайн
0
Знач будем позже решать этот вопрос )))
А теперь новый вопрос
Как передать переменную в MySQL запрос
cursor.execute(“”“ UPDATE house SET house_free = REPLACE(house_free, ‘1’, ‘0’) WHERE (id = busy_id) ”“”)
суть такая
есть таблица house
в ней есть столбец булеан house_free ну и столбец id
надо сделать так, чтобы запрос менял “1” на “0” но в конкретной строке id, которая задается busy_id
База MySQL
Заранее спасибо
Офлайн
72
cursor.execute("UPDATE house SET house_free = REPLACE(house_free, ‘1’, ‘0’) WHERE (id = ?)", (busy_id,))
Офлайн
0
PooH
Вы документацию по DB API из принципа читать не хотите?
Офлайн