как форматировать вывод в sqlalchemy?

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

Мне нужна помощь с форматом вывода в приведенном ниже коде:

     p = select([persons])
    st = select([persons,students]).where(students.c.id == persons.c.id)
    t = select([persons,teachers]).where(persons.c.id == teachers.c.person_id)
    cl = select([classes])
    s_in_cl = select([students_in_class])

    p1 = conn.execute(p)
    st1 = conn.execute(st)
    t1 = conn.execute(t)
    cl1 = conn.execute(cl)
    ss1 = conn.execute(s_in_cl)

    print('nTable "persons" : n')
    q1 = p1.fetchall()
    if len(q1) < 1 : print('tTable "persons" is empty!n')
    else :
        for row in q1 : print(f't{row}')

    print('nTable "students" : n')
    q2 = st1.fetchall()
    if len(q2) < 1 : print('tTable "students" is empty!n')
    else : 
        for row in q2 : print(f't{row}')

    print('nTable "teachers" : n')
    q3 = t1.fetchall()
    if len(q3) < 1 : print('tTable "teachers" is empty!n')
    else :
        for row in q3 : print(f't{row}')

    print('nTable "classes" : n')
    q4 = cl1.fetchall()
    if len(q4) < 1 : print('tTable "classes" is empty!n')
    else : 
        for row in q4 : print(f't{row}')

    print('nTable "students_in_class" : n')
    q5 = ss1.fetchall()
    if len(q5) < 1 : print('tTable "students_in_class" is empty!n')
    else : 
        for row in q5 : print(f't{row}')
 

Текущий вывод :

Таблица «лица» :

     (2, 'Rajiv', 'Khanna', None, None)
    (3, 'Komal', 'Bhandari', None, None)
    (4, 'Michael', 'Ross', 'mikey4@gmail.com', datetime.datetime(2006, 10, 12, 0, 0))
    (5, 'Ann', 'Ross', 'ann_qw@gmail.com', datetime.datetime(2021, 11, 25, 0, 0))
 

Таблица «студенты» :

     (4, 'Michael', 'Ross', 'mikey4@gmail.com', datetime.datetime(2006, 10, 12, 0, 0), 1, 4)
 

Таблица «учителя» :

     (3, 'Komal', 'Bhandari', None, None, 1, 3)
 

Таблица «классы» :

     (1, 'philosophy', 'group_1', 1)
 

Таблица «students_in_class» :

     Table "students_in_class" is empty!
 

Я хочу видеть его в форме PrettyTable, как я могу добавить к нему заголовки (имена столбцов) и правильно отформатировать строки (строки таблицы)?
Любая помощь будет оценена 😉

Комментарии:

1. что вы пробовали? может быть, просто использовать print("text with headers") для просмотра заголовков? И если вы хотите лучше отформатировать, тогда, возможно, используйте более сложную f-строку, т.е. f"{row[0]} | {row[1]} | ..." И если вы хотите видеть в форме PrettyTable , то, возможно, вам следует проверить документацию для PrettyTable и использовать этот модуль. Для создания с нуля сначала потребуется получить длины для всех значений, а затем распечатать таблицу, используя дополнительные значения в f-string — т.е. f"{row[0]:10} Для создания текста длиной 10 символов.

2. пожалуйста, не ставьте код после : — это делает код нечитаемым. Поместите код в следующую строку.

Ответ №1:

Если вы хотите использовать PrettyTable , то у вас есть все в документации

Сначала создайте PrettyTable() и затем назначьте список с именами столбцов table.field_names , затем добавьте все строки в таблицу и, наконец print() , ее.

 import datetime

q1 = [
    (2, 'Rajiv', 'Khanna', None, None),
    (3, 'Komal', 'Bhandari', None, None),
    (4, 'Michael', 'Ross', 'mikey4@gmail.com', datetime.datetime(2006, 10, 12, 0, 0)),
    (5, 'Ann', 'Ross', 'ann_qw@gmail.com', datetime.datetime(2021, 11, 25, 0, 0)),
]

from prettytable import PrettyTable

table = PrettyTable()

table.field_names = ["A", "B", "C", "D", "E"]
table.add_rows(q1)

print(table)
 

Дает

  --- --------- ---------- ------------------ --------------------- 
| A |    B    |    C     |        D         |          E          |
 --- --------- ---------- ------------------ --------------------- 
| 2 |  Rajiv  |  Khanna  |       None       |         None        |
| 3 |  Komal  | Bhandari |       None       |         None        |
| 4 | Michael |   Ross   | mikey4@gmail.com | 2006-10-12 00:00:00 |
| 5 |   Ann   |   Ross   | ann_qw@gmail.com | 2021-11-25 00:00:00 |
 --- --------- ---------- ------------------ --------------------- 
 

Если вы хотите сделать то же самое без PrettyTable , то это потребует много работы, потому что сначала вы должны получить максимальную длину в каждом столбце, а позже вы можете использовать ее f-string для установки длины строки в столбце — ie.

 f"{row[0]:{lenght_row_0}} | {row[1]:{lenght_row_1}} | ... "
 

Пример

 import datetime

q1 = [
    (2, 'Rajiv', 'Khanna', None, None),
    (3, 'Komal', 'Bhandari', None, None),
    (4, 'Michael', 'Ross', 'mikey4@gmail.com', datetime.datetime(2006, 10, 12, 0, 0)),
    (5, 'Ann', 'Ross', 'ann_qw@gmail.com', datetime.datetime(2021, 11, 25, 0, 0)),
]

# --- add headers ---

q1.insert(0, ["A", "B", "C", "D", "E"])

# --- lengths ---

columns_lengths = [0 for _ in range(len(q1[0]))]

for row in q1:
    for number, item in enumerate(row):
        length = len(str(item))
        if length > columns_lengths[number]:
            columns_lengths[number] = length

# --- horizontal line ---

items = []
for number, item in enumerate(row):
    length = columns_lengths[number]
    items.append(f'{"-"*(length 2)}')
horizontal_line = " "    " ".join(items)   " "

# --- table ---

# - line -

print(horizontal_line)

# - header - 

items = []
for number, item in enumerate(q1[0]):
    length = columns_lengths[number]
    items.append(f'{str(item):^{length}}')
print("|", " | ".join(items), "|")

# - line -

print(horizontal_line)

# - rows - 

for row in q1[1:]:
    items = []
    for number, item in enumerate(row):
        length = columns_lengths[number]
        items.append(f'{str(item):^{length}}')
    print("|", " | ".join(items), "|")

# - line -

print(horizontal_line)
 

Результат:

  --- --------- ---------- ------------------ --------------------- 
| A |    B    |    C     |        D         |          E          |
 --- --------- ---------- ------------------ --------------------- 
| 2 |  Rajiv  |  Khanna  |       None       |        None         |
| 3 |  Komal  | Bhandari |       None       |        None         |
| 4 | Michael |   Ross   | mikey4@gmail.com | 2006-10-12 00:00:00 |
| 5 |   Ann   |   Ross   | ann_qw@gmail.com | 2021-11-25 00:00:00 |
 --- --------- ---------- ------------------ ---------------------