Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 27, 2014 23:09:18

tadej
От: Львов
Зарегистрирован: 2014-12-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

спасибо всем кто откликнулся на мой предыдущий вопрос, но возник новый
Итак, есть
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)

Офлайн

#2 Дек. 28, 2014 11:44:05

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

Начнем с того, что по PEP 249 значение возвращаемое execute не определено (хотя в вашем случае это похоже число возвращенных строк, но полагаться на это не следует). чтобы получить результат запроса надо вызвать cursor.fetchone()(ну или fetchmany. fetchall и т.д.)

Далее, получать последний id через max не следует, представьте что пишут в базу хотя бы два потока.

Для получения последнего вставленного id у курсора есть свойство Cursor .lastrowid хотя тут зависит от базы данных и библиотеки доступа, поскольку свойство это опционально.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Дек. 28, 2014 11:45:45)

Офлайн

#3 Дек. 28, 2014 12:49:15

tadej
От: Львов
Зарегистрирован: 2014-12-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

Спасибо, но

PooH
Далее, получать последний id через max не следует, представьте что пишут в базу хотя бы два потока.
в конкретном случае поток один, и последний (максимальный) ИД бутет тот что записан в предыдущей строчки програми. (в даном случае, это регистрация пользователя)

PooH
Для получения последнего вставленного id у курсора есть свойство Cursor .lastrowid хотя тут зависит от базы данных и библиотеки доступа, поскольку свойство это опционально.
Шас будем разбиратся ))))

UPD
Спасибо за совет, но оказывается есть намного проще вариант
con.insert_id() – Возвращает ID, сгенерированный для столбца AUTO_INCREMENT предыдущим запросом

Отредактировано tadej (Дек. 28, 2014 13:03:07)

Офлайн

#4 Дек. 28, 2014 14:32:43

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

tadej
в конкретном случае поток один, и последний (максимальный) ИД бутет тот что записан в предыдущей строчки програми. (в даном случае, это регистрация пользователя)
Регистрация пользователя? Не веб ли это приложение? Тогда там никак не один поток.

tadej
Спасибо за совет, но оказывается есть намного проще вариант
con.insert_id() – Возвращает ID, сгенерированный для столбца AUTO_INCREMENT предыдущим запросом
Вы не сказали что у вас MySQL. Рекомендую все же пользоваться .lastrowid - он описан в DB API, т.е. стандартен, хотя и не реализован для некоторых библиотек, в частности для MSSQL через pypyodbc, а insert_id чисто мускульная приблуда.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Дек. 28, 2014 17:50:27

tadej
От: Львов
Зарегистрирован: 2014-12-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

PooH
Тогда там никак не один поток.
Почему?
Пока не пройдет весь цикл регистрации, следующий пользователь не зарегится.
Хотя я мало знаю, и 100500% все что я пишу придется перелопачевать и оптимизировать )))

Офлайн

#6 Дек. 28, 2014 17:53:36

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

tadej
PooH
Тогда там никак не один поток.
Почему?
Пока не пройдет весь цикл регистрации, следующий пользователь не зарегится.
Потому что веб-приложение обычно запускается в несколько потоков, чтобы пользователи могли работать с ним одновременно(про асинхронные библиотеки помним, но тут умалчиваем).



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Дек. 28, 2014 18:29:01

tadej
От: Львов
Зарегистрирован: 2014-12-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

Знач будем позже решать этот вопрос )))

А теперь новый вопрос
Как передать переменную в 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
Заранее спасибо

Офлайн

#8 Дек. 28, 2014 18:42:36

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

cursor.execute("UPDATE house SET house_free = REPLACE(house_free, ‘1’, ‘0’) WHERE (id = ?)", (busy_id,))
Вы документацию по DB API из принципа читать не хотите? ;)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Дек. 28, 2014 18:48:02

tadej
От: Львов
Зарегистрирован: 2014-12-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Максимальное значение ключа_id

PooH
Вы документацию по DB API из принципа читать не хотите?

я языка не знаю )))) пока не знаю
спасибо.
Пошел учится дальше, но не надолго, скоро опять вопросы будут ))))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version