Oracle / SQL Server Table в файл - без неявного преобразования данных - PullRequest
0 голосов
/ 12 февраля 2020

Я получаю данные из SQL (Oracle и MS SQL обе) баз данных из кода python с использованием пакетов pyodb c и cx Oracle. Python автоматически преобразует все поля даты и времени в SQL в datetime.datetime. Есть ли способ, как я могу захватить данные из SQL в файл. То же самое происходит с пустыми и целочисленными столбцами. 1) Дата: значение в БД и ожидаемое - 12-АВГУСТ-19 12.00.01.000 - Python Вывод: 2019-08-12 00:00:01 2) Нуль становится NaN 3) Целочисленные значения 1 с и 0 с становятся Правда и ложь. Я попытался решить проблему с помощью Google, и, похоже, это общая проблема всех пакетов, таких как pyodb c, cx_ oracle, pandas .read_ sql. Я хотел бы, чтобы данные отображались точно так же, как в базе данных.

Мы вызываем запрос Oracle / SQL Server Stored pro c, а НЕ SQL, чтобы получить этот результат, и мы можем ' сменить сохраненный pro c. Мы не можем использовать CAST в запросе sql.

Pyodb c fetchall () выводит таблицу в формате списка. Мы теряем форматирование данных, как только они записываются в python.

Может ли кто-нибудь помочь с этой проблемой?

1 Ответ

0 голосов
/ 12 февраля 2020

Я не уверен насчет Oracle, но на стороне сервера SQL вы можете изменить используемую команду, чтобы записать результаты сохраненного pro c во временную таблицу, а затем вы может CAST() столбцы временной таблицы.

Так что если вы в данный момент вызываете сохраненного профи c на SQL сервере, например: EXEC {YourProcName}

Тогда вы можете изменить свой введите что-то вроде этого:

CREATE TABLE #temp 
(
    col1 INT
    ,col2 DATETIME
    ,col3 VARCHAR(20)
);

INSERT INTO #temp
EXEC [sproc];

SELECT 
    col1 = CAST(col1 AS VARCHAR(20))
    ,col2 = CAST(FORMAT(col2,'dd-MMM-yy ') AS VARCHAR) + REPLACE(CAST(CAST(col2 AS TIME(3)) AS VARCHAR),':','.')
    ,col3 
FROM #temp;

DROP TABLE #temp

Вы захотите создать временную таблицу, используя те же имена столбцов и типы данных, которые получают выходные данные от pro c. Затем вы можете CAST() цифры c значения до VARCHAR, а с датами / датами и временем вы можете использовать FORMAT() для определения формата строки даты. Приведенный здесь пример должен привести к формату, который вы хотите 12-AUG-19 12.00.01.000. Я не смог найти единственную строку формата, которая дала бы мне правильный вывод, поэтому я разбил элементы даты и времени на части, отформатировал их ожидаемым образом, а затем конкатенировал приведенные значения.

...