Как я могу собрать все данные из базы данных с помощью SqlQuery одновременно?

Я хотел бы собрать все записи в базе данных и записать их в файл .csv.

Для этого я попытался придумать такой цикл while:


def create_csv():
     query = QSqlQuery(db=db)
     query.prepare("SELECT * FROM database_name")
     query.exec()
     rec = query.record()
            
     print(query.isSelect())
     nameCol = rec.indexOf("name")

          while query.next():
          print(query.value(nameCol)) 

Это дает мне все записи в имени столбца, как и ожидалось. Но поскольку в базе данных намного больше столбцов, мне было интересно, есть ли более простой способ получить все столбцы (и заголовки) сразу?

Все сразу сделало бы создание csv намного проще.


person Nullschall    schedule 09.06.2021    source источник


Ответы (2)


Вы можете сделать это с помощью простой команды SQL:

select * from passtable4 LOCAL INTO OUTFILE 'C:\test.csv' FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"' LINES TERMINATED BY '\r\n';

Вы можете столкнуться с этой ошибкой:

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Решения представлены здесь и здесь

Если в вашей базе данных используются разные типы данных (например, дата, BLOB и т. д.), вы можете найти гораздо более подробное руководство здесь

person Theorist    schedule 09.06.2021
comment
Спасибо за ваш ответ @Mayank. Я почти уверен, что это будет работать с MySql. Но поскольку я использую базу данных MS Access с драйвером QODBC, мне понадобится немного другой синтаксис. У меня уже была эта проблема с фильтрацией БД. см. здесь - person Nullschall; 10.06.2021

Это заняло некоторое время, но я думаю, что нашел то, что сработало для меня:

  • Я начал с создания имени файла и создал 2 списка.
  • выполнил запрос, который дает мне все значения таблицы
  • запустил цикл for для получения заголовков.
  • запустил цикл while, который генерирует временную строку элемента списка
  • добавлен временный элемент списка в список значений, чтобы он стал списком списков
  • построил Pandas-dataframe и использовал to_csv по желанию.

Я уверен, что есть более умные и быстрые способы сделать это. Но, по крайней мере, это работает для меня.

 def create_csv(self):
    
    today = datetime.today()
    now = today.strftime("%y%m%d_%H%M_%S_")
    
    filename = f"{jetzt}COS.csv"
    
    

    Column_Header=[]
    Article_Value=[]
    
    query = QSqlQuery(db=db)
    query.prepare(r"SELECT * FROM database_name")
    query.exec()
    
    rec = query.record()
    
    for id in range(rec.count()):
        
        Column_Header.append(rec.fieldName(id))
        
    indexes = range(rec.count())
        
    while query.next():
        
        row = [query.value(index) for index in indexes]
        
        
        Article_Value.append(row)
        
    df = pd.DataFrame(Article_Value, columns=Column_Header, index=None) 

    print(df)
    
    df.to_csv(filename,sep=';',index=False)
person Nullschall    schedule 20.07.2021