tremo0880
@tremo0880
Inf.Sec

Как писать данные в pdf из mysql Python?

Всем доброго времени суток!
Второй день пытаюсь решить проблему при попытке извлечь данные из mysql и записать их корректно в pdf файл. Работаю с flask-oм,а для создания pdf файлов использую библиотеку reportlab.
В базе имеется 6 колонок типов:
Приведу код ниже: int, date, time, varchar, varchar,int
data = c.fetchall() # вытаскидываю данные из базы
for row in data:
            ptext = row
            Story.append(Paragraph(ptext,styles["Normal"]))
            Story.append(Spacer(1, 12))
        doc.build(Story) # пишет в pdf

Получаю следующую ошибку:
AttributeError: 'tuple' object has no attribute 'split'

Когда делаю тоже самое, но пишу в текстовый файл, получаю следующее:
(datetime.date(2016, 12, 12), datetime.timedelta(0, 72785), 'late', 'Monday')
  • Вопрос задан
  • 379 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
В строку нужно преобразовать каждый отдельный элемент кортежа. Если количество полей известно, неизменно и немногочисленно:
ptext = '{} {} {} {}'.format(
  row[0].strftime('%d.%m.%Y'),
  row[1].strftime('%d.%m.%Y'),
  row[2],
  row[3]
)
Story.append(Paragraph(ptext, styles["Normal"]))

Более универсальный вариант - обойти поля в цикле:
ptext = ''
for ndx, field in enumerate(row):
    if ndx:
        ptext += ' '
    if isinstance(field, date):
        ptext += field.strftime('%d.%m.%Y')
    else:
        ptext += str(field)
Story.append(Paragraph(ptext, styles["Normal"]))

В примере сознательно использован антипаттерн наращивания строки, для демонстрации этой возможности.

Или использовать включение, так будет чутка резвее и компактнее:
ptext = ' '.join(field.strftime('%d.%m.%Y') if isinstance(field, date) else str(field) for field in row)
Story.append(Paragraph(ptext, styles["Normal"]))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы