Сортировка результатов SQL для удобства чтения?

0

НОВЫЕ ПРОСМОТРЫ: ЭТО ВОПРОС РЕШЕН

Мне нужно изменить визуальную компоновку результатов SQL-запроса, и я НЕ МОГУ ИСПОЛЬЗОВАТЬ ВНЕШНИЕ БИБЛИОТЕКИ, только python/idle.

Я делаю программу, которая должна принимать пользовательские варианты и строить из них SQL-запрос, который будет запрашивать базу данных и давать пользователю все соответствующие результаты. Существует поиск по ключевым словам, и пользователь может указать, в каком столбце выполняется поиск ключевого слова. Ничто из этого не беспокоит меня, я фактически застрял на чем-то другом:

Моя база данных - это всего одна таблица с 9 столбцами, все они либо символами, либо целями. Для целей тестирования я ввел только три "записи". В соответствующей базе данных будет несколько более ста. Например, запрос базы данных, например:

select distinct label,format,catnum,year,artist,relname from testtable

Дает следующее:

[('PENN', 'LP', '002', '1972', 'Frank Penn', "'72"), ('GBI', 'LP', '104', '1974', 'The Mustangs', 'On Tha Rocks'), ('GBI', 'Single', '235', '1978', 'Willpower', 'Love Makes It Alright')]

Я был бы рад узнать, как я могу выводить ONE RECORD PER LINE, когда я выводим результаты SQL-запроса, примерно так:

[('PENN', 'LP', '002', '1972', 'Frank Penn', "'72"), 
('GBI', 'LP', '104', '1974', 'The Mustangs', 'On Tha Rocks'), 
('GBI', 'Single', '235', '1978', 'Willpower', 'Love Makes It Alright')]

Или, еще лучше, как это, удаление речевых меток и квадратных скобок:

(PENN, LP, 002, 1972, Frank Penn, '72), 
(GBI, LP, 104, 1974, The Mustangs, On Tha Rocks), 
(GBI, Single, 235, 1978, Willpower, Love Makes It Alright)

Вот мой код:

import sqlite3

conn = sqlite3.connect(':memory:')

cursor = conn.cursor()

cursor.execute("""CREATE TABLE testtable (
        label char,
        format char,
        catnum char,
        sidecat char,
        year char,
         artist char,
        relname char,
        trackname char,
        composer char,
        collection int
        )""")

conn.commit()

cursor.execute('''INSERT INTO testtable VALUES ("PENN", "LP", "002", "002 (B)", "1972", "Frank Penn", "'72", "The Time For Loving Is Now", "Frank Penn", 1)''')
conn.commit()
cursor.execute('''INSERT INTO testtable VALUES ("GBI", "LP", "104", "104 (B)", "1974", "The Mustangs", "On Tha Rocks", "Someday We'll Be Together", "Unknown", 1)''')
conn.commit()
cursor.execute('''INSERT INTO testtable VALUES ("GBI", "Single", "235", "235 (B)", "1978", "Willpower", "Love Makes It Alright", "The Mail", "Eddie Minnis", 1)''')
conn.commit()


cursor.execute("select distinct label,format,catnum,year,artist,relname from testtable")
print(cursor.fetchall())


conn.close()

EDIT: Это решение, которое я реализовал на основе пользовательского предложения nikpod:

cursor.execute("select distinct label,format,catnum,year,artist,relname from testtable")
foo = cursor.fetchall()
foo = (str(foo).replace("), ","),\n").strip('[]'))
print(foo)
conn.close()

Предоставление:

('PENN', 'LP', '002', '1972', 'Frank Penn', "'72"),
('GBI', 'LP', '104', '1974', 'The Mustangs', 'On Tha Rocks'),
('GBI', 'Single', '235', '1978', 'Willpower', 'Love Makes It Alright')

Я нашел возможным использовать команду "replace" для удаления всего, что вам не нужно:

foo = (str(foo).replace("), ","),\n").strip('[]'))
foo = (str(foo).replace("('",""))
foo = (str(foo).replace('("',""))
foo = (str(foo).replace("',",","))
foo = (str(foo).replace(", '",", "))
foo = (str(foo).replace("'),",""))
foo = (str(foo).replace("')",""))
foo = (str(foo).replace('", ',", "))
foo = (str(foo).replace(', "',", "))
foo = (str(foo).replace('"),',""))

Использует много строк кода, конечно, но общая идея имеет значение. Что-то вроде этого, вы можете сделать вывод немного приятнее:

PENN, LP, 002, 1972, Frank Penn, '72
GBI, LP, 104, 1974, The Mustangs, On Tha Rocks
GBI, Single, 235, 1978, Willpower, Love Makes It Alright

Спасибо всем за их вклад, изначально этот вопрос был сформулирован довольно плохо

Теги:
database
sql-server

2 ответа

0
Лучший ответ

Вы должны распечатать список кортежей в виде строки и манипулировать им в соответствии с вашим требованием.
Это пример, который по-прежнему содержит кавычки, но к первому требованию:

foo = [('PENN', 'LP', '002', '1972', 'Frank Penn', "'72"), ('GBI', 'LP', '104', '1974', 'The Mustangs', 'On Tha Rocks'), ('GBI', 'Single', '235', '1978', 'Willpower', 'Love Makes It Alright')]
print(str(foo).replace("), ","),\n").strip('[]'))

Это дает результат:

('PENN', 'LP', '002', '1972', 'Frank Penn', "'72"),
('GBI', 'LP', '104', '1974', 'The Mustangs', 'On Tha Rocks'),
('GBI', 'Single', '235', '1978', 'Willpower', 'Love Makes It Alright')
  • 0
    Привет nikpod, спасибо за ваш ответ. Это в какой-то мере отвечало бы всем требованиям, но я не могу заставить его работать. Если я изменю ваш код, чтобы сохранить результаты запроса в виде переменной, вместо самого списка (это необходимо) он будет выглядеть следующим образом: foo = cursor.execute ("SELECT * FROM testtable"), за которым следует print (str (foo) .replace ("),", "), \ n"). strip ('[]')), а затем мой вывод будет таким: "<sqlite3.Cursor object at 0x02D98C60>". Что делать, чтобы этого избежать?
  • 0
    Теперь я успешно выполнил ваше предложение. Это просто, конечно.
0

Не уверен, что это поможет вам, но может.

example = [("index", "0", "contains", "these"),("index", "1", "contains", "these")]

list1 = example[0]  # 1st index is 0, this grabs ("index", "0", "contains", "these")
length = len(example)  # sets length to 2 for example as there are 2 lists

# you can access the elements in each list by either
example[0][1]  # gives "1"

# or the same thing by using list1 created earlier
list1[1]  # also gives "1"

# to work through all lists and all elements in the list
for each_list in example:
    # do something at the start of a list
    for each_element in each_list:
        print(each_element)
        # do something to each element in a list
    # do something at the end of a list
  • 0
    Это хорошее решение, я уверен, что это можно использовать, хотя и в несколько ином контексте. Возможно, в запросах, где отображается только один результат. Спасибо за вклад.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню