@python_beginnersЭта группа больше не существует

Страница 625 из 1885
Вадим
25.10.2016
17:25:58
всем привет подскажите почему запрос к базе 'SELECT * FROM vegan WHERE id = ?' выдает только айди, а не всю строку в базе айди имеет примари кей ? хочется что бы печаталось все что вся старка что связана с этим айди у меня там поля id и recep

Igor
25.10.2016
17:26:52
странно. SELECT * должен выдавать всю строку. какая бд? sqlite, mysql, postgres, ...?

Вадим
25.10.2016
17:27:35
sqllite

Igor
25.10.2016
17:27:51
покажи .schema vegan

Google
Вадим
25.10.2016
17:29:57
CREATE TABLE vegan ( id INTEGER, recept TEXT, PRIMARY KEY(id) )

структуру *

?

Igor
25.10.2016
17:30:34
ага. и че, recept прям не видно вообще? может, он пустой просто?

Вадим
25.10.2016
17:30:34
я просто на винде и не пользуюсь консолью

Igor
25.10.2016
17:30:49
а чем пользуешься?

Вадим
25.10.2016
17:31:18
db browser sqllite

вывод есть но он кривой какой то,[(2, ' ..... текст')]

вот таког оформата

Igor
25.10.2016
17:32:38
ну вот

[...] - это одна строка

Zart
25.10.2016
17:32:53
почему кривой

Igor
25.10.2016
17:32:55
(...) - это столбцы

Google
Zart
25.10.2016
17:32:56
список строк и есть

Igor
25.10.2016
17:33:07
2 - это id '..... текст' - это recept

всё правильно

Вадим
25.10.2016
17:34:25
да это я уже понял, пробелма в том что когда из класса написанного у меня для работы с базой. и пытаешься импортирвоать в другой скрипт и там сделат вывод то получается что выводится только айди без остального. хотя я передаю вызовом метода прямо на печать

Igor
25.10.2016
17:34:27
(кстати, если имеется в виду кулинарный рецепт, то правильно пишется recipe)

ну покажи скрипт. но в целом, если у тебя есть структура list of tuples (список из кортежей), где в кортеже два элемента - id и recept, то можно сделать так: for row in rows: for id, recept in row: print('id: {0}, recept: {1}'.format(id, recept))

при этом rows - это [(1, 'one'), (2, 'two'), (3, 'three')] а row, соответственно, будет равно например (1, 'one')

Вадим
25.10.2016
17:38:11
rownum = random.randint(1,self.count_rows()) with self.connection: return self.cursor.execute('SELECT * FROM vegan WHERE id = ?', (rownum,)).fetchall()

это выбор айди

Igor
25.10.2016
17:39:10
эээ. таак. и? функция, в которой находится этот код, будет возвращать только одну пару [(id, recept)]

Вадим
25.10.2016
17:39:46
так мне и надо одну случаную пару

db = baza.Basesql('cooking.db') bot.send_message(message.chat.id, db.select_random())

вроде модуль и класс я определил верно

Вадим
25.10.2016
17:41:03
вот так полная

def select_random(self): rownum = random.randint(1,self.count_rows()) with self.connection: return self.cursor.execute('SELECT * FROM vegan WHERE id = ?', (rownum,)).fetchall()

Igor
25.10.2016
17:41:11
ну да, похуй

и че тебе от бота по факту приходит?

прям только-только число?

Вадим
25.10.2016
17:41:41
только айди

Google
Вадим
25.10.2016
17:41:45
да

Igor
25.10.2016
17:41:46
или именно [(id, recept)]

Вадим
25.10.2016
17:41:53
только число

Igor
25.10.2016
17:42:00
Вадим
25.10.2016
17:42:27
это если класс вызвать отдельно от бота

Igor
25.10.2016
17:42:54
что будет, если ты сделаешь значит, send_message так странно работает. тебе надо, скорее, отправлять туда вторым аргументом строку, а не список из кортежей.

я бы поменял fetchall() на fetchone() в функции select_random

она, вроде бы, должна вернуть не список с одним элементом (кортежем), а просто кортеж из двух элементов

Вадим
25.10.2016
17:44:38
Спасибо ! , сейчас попробую., да наверно у телеграма только строка принимается а по сути пытался передать сразу 2 элемента

Igor
25.10.2016
17:45:00
а затем, когда ты вызываешь send_message, исправить там db.select_random() на '%d %s' % db.select_random()

b0g3r
25.10.2016
17:45:13
может лучше ' '.join()?

Igor
25.10.2016
17:45:26
или так, да. whatever :)

b0g3r
25.10.2016
17:45:37
а то мало ли там больше элементов

будет когда-нибудь

Igor
25.10.2016
17:46:37
ну, it depends далее уже. получить от бота сообщение "1 смешайте пять листьев салата и залейте маслом" это как-то не очень. получить от бота сообщение "рецепт №1: смешайте пять листьев салата и залейте маслом" уже лучше. и это ты join'ом не сделаешь

зато легко сделаешь любым string formatting'ом 'рецепт №%d:\n\n%s' % db.select_random() например

больше полей - больше каши если добавить время приготовления, будет '1 смешайте пять листьев салата и залейте маслом 15 минут'

Вадим
25.10.2016
17:49:07
Спасибо за помощь, все заработало, '%d %s' % db.select_random() %d - это мы id передаем а %s - это рецепт, не думал что так вообще можно

Igor
25.10.2016
17:51:38
да. грубо говоря, получается так: '%d %s' % (1, 'текст рецепта') слева в строке выводятся элементы, перечисленные по порядку из кортежа справа. %d выводит число, %s - строку подробнее можно почитать здесь https://docs.python.org/2/library/stdtypes.html#string-formatting этот формат считается устаревшим, лучше пользоваться .format(). про него, в свою очередь, можно почитать здесь https://docs.python.org/3/library/string.html#format-string-syntax

Вадим
25.10.2016
17:54:48
то есть я могу там сейчас и на формат заменить ? я про нег очитал уже и знаю его синтаксис. просто не знал что можно в таких местах использовать. Спасибо !

Google
Igor
25.10.2016
17:57:41
не за что. но учти, что с .format придется немного изменить код. есть вариант распаковать (unpack) кортеж: id, recept = select_random() send_message(chat_id, '{0} {1}'.format(id, recept)) есть вариант распаковать его звездочкой без промежуточных переменных: (про это ты можешь еще быть не в курсе) send_message(chat_id, '{0} {1}'.format(*select_random()))

Admin
ERROR: S client not available

Igor
25.10.2016
18:00:42
да было б за что :)

V
25.10.2016
18:01:06
не за что. но учти, что с .format придется немного изменить код. есть вариант распаковать (unpack) кортеж: id, recept = select_random() send_message(chat_id, '{0} {1}'.format(id, recept)) есть вариант распаковать его звездочкой без промежуточных переменных: (про это ты можешь еще быть не в курсе) send_message(chat_id, '{0} {1}'.format(*select_random()))
а зачем 0 и 1? можно же просто {} {}. но когда аргументов больше 2 я вообще предпочитаю именованные аргументы, чтоб не запутаться где что. а иногда проще заранее собрать словарь а потом формату его скормить типа .format(**values)

Igor
25.10.2016
18:03:04
а зачем 0 и 1? можно же просто {} {}. но когда аргументов больше 2 я вообще предпочитаю именованные аргументы, чтоб не запутаться где что. а иногда проще заранее собрать словарь а потом формату его скормить типа .format(**values)
можно, да. {} {} лично мне кажется не таким понятным/очевидным для новеньких про словарь хотел рассказать, но стало лень, и так слишком большая простыня.

V M имел в виду, что в select_random тебе было бы удобнее/понятнее/whatever написать че-нибудь типа return {'id': row[0], 'recept': row[1]} а потом воспользоваться row = select_random() msg = '{} {}'.format(row['id'], row['recept'])

вон в документации описан пример dict_factory, чтобы fetchone() сразу вернула словарь, но это только больше напугает тебя, имхо https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.row_factory

Вадим
25.10.2016
18:09:58
а вообще как sql запросы и безопасность ? мне рассказывали что в python есть какие то библиотеки которые помогают более эффективно делать запросы в базу и это защищает от sql инекций

это у меня функция такая

Igor
25.10.2016
18:11:40
выбирает рандомную строку из таблицы*

есть штуки, которые называются ORM. у джанго есть своя ORM. есть и сторонняя - SQLAlchemy, ее можно подключить к любому питоньему проекту. есть просто БД-клиенты, типа встроенного в питон модуля sqlite3. это не ORM, но он защищает от SQL-инъекций, если делаешь запрос с помощью метода execute

b0g3r
25.10.2016
18:15:15
(из ORM ещё есть peewee)

Igor
25.10.2016
18:15:29
как она может подойти? ему че, надо забрать все строки из бд (а если их 100500?), и потом все это засунуть в shuffle? )

b0g3r
25.10.2016
18:15:35
так для этого нужно вытянуть всё из бд

Letalis
25.10.2016
18:15:35
Господа! А каким способом лучше всег осохранить несколько картинок по ссылкам из интернета? Допустим, есть список с адресами, и их все надо сохранить. Вот что у меня сейчас: def download_web_image(url_list): name = random.randrange(1, 1000) full_name = str(name) + '.jpeg' for i in url_list: print(i) urllib.request.urlretrieve(i, full_name) и он сохраняет под рандомным именем только одну картинку, а если их в списке несоклько, то перезаписывает.

Igor
25.10.2016
18:15:50
он делает randint и SELECT * FROM table WHERE id = randint(...)

там, правда, есть недочет, но мне лень его объяснять :(

Letalis
25.10.2016
18:17:36
на жесткий диск просто

b0g3r
25.10.2016
18:17:39
какая запись)

Google
Letalis
25.10.2016
18:17:46
сохранение картинок

Igor
25.10.2016
18:17:47
for url in url_list: name = '{}.jpeg'.format(random.randrange(1, 1000)) urllib.request.urlretrieve(url, name)

файлом, в текущую папку

https://docs.python.org/2/library/urllib.html#urllib.urlretrieve

b0g3r
25.10.2016
18:18:33
просто кусок кода не в том блоке - генерацию name нужно вынести в цикл for

Igor
25.10.2016
18:18:46
неважно, он сначала генерирует одно рандомное число, а потом сохраняет 10 (предположим) картинок с названием этого одного рандомного числа

Letalis
25.10.2016
18:18:48
кстати, я вот гуглил недавно, гвоорят urlretrieve помечена как legacy - правду гвоорят?

Igor
25.10.2016
18:19:01
for url in url_list: name = '{}.jpeg'.format(random.randrange(1, 1000)) urllib.request.urlretrieve(url, name)

да, рано или поздно все равно может перезаписать. я б uuid делал или сохранял оригинальное название картинки из url'а

Страница 625 из 1885

Эта группа больше не существует Эта группа больше не существует