Pandas read_ sql с pyodb c для обработки поврежденных данных - PullRequest
1 голос
/ 05 марта 2020

Я работаю с клиентом, у которого есть база данных 4D. Tableau не будет подключаться к нему. (Это совсем другая проблема, и если вы знаете ответ на этот вопрос, дайте мне знать.) Что мы решили сделать, так это сохранить две копии данных. Я создаю инструмент в Python, который берет любую произвольную таблицу из своей базы данных и сохраняет ее копию в базе данных MySQL. Затем он будет периодически запускаться и обновлять данные по мере добавления новых данных.

Я бы предпочел использовать SqlAlchemy, но он не поддерживает 4D. Итак, я использую pyodb c с pandas. Я использую

data_chunks = pandas.read_sql("SELECT * FROM table_name", con=pyodbc_connection, chunksize=100000)

Затем я оборачиваюсь и использую

chunk_df.to_sql("table_name", con=sqlalchemy_mysql_connection, index=False, if_exists="append")

, чтобы записать его в базу данных MySQL.

К сожалению, в некоторых таблицах, в которых я читаю, есть поврежденные данные, и я получаю ValueError о том, что The year xxxxx находится вне диапазона.

Последняя функция, вызванная в след был data = cursor.fetchmany(chunksize), который я считаю, от pyodb c.

Как я могу прочитать данные из любой произвольной таблицы и уметь корректно обрабатывать поврежденные данные и продолжать работу?

1 Ответ

1 голос
/ 11 марта 2020

Можно использовать функцию Pyodb c Output Converter для перехвата поврежденных значений даты и «исправить» их, используя код, подобный следующему:

def unpack_sql_type_timestamp(raw_bytes):
    y, m, d, h, n, s, f = struct.unpack("<h5HI", raw_bytes)
    if y > 9999:
        y = 9999
    elif y < 1:
        y = 1
    return datetime.datetime(y, m, d, h, n, s, f)

pyodbc_connection = pyodbc.connect(connection_string)

pyodbc_connection.add_output_converter(
    pyodbc.SQL_TYPE_TIMESTAMP, 
    unpack_sql_type_timestamp
)

data_chunks = pandas.read_sql_query(
    "SELECT * FROM table_name", 
    con=pyodbc_connection, 
    chunksize=100000
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...