Есть таблица Oracle, которую мне нужно заполнить данными о погоде. Вот как выглядит таблица:
"IDGRID" NUMBER(12,0) NOT NULL,
"DAY" DATE CONSTRAINT NOT NULL,
"TEMPERATURE_MAX" NUMBER(3,1) NOT NULL,
"TEMPERATURE_MIN" NUMBER(3,1) NOT NULL,
"TEMPERATURE_AVG" NUMBER(3,1) NOT NULL,
"TEMPERATURE_DEW" NUMBER(3,1) NOT NULL,
"VAPOURPRESSURE" NUMBER(4,2) NOT NULL,
"WINDSPEED" NUMBER(5,1) NOT NULL,
"PRECIPITATION" NUMBER(4,1) NOT NULL,
"RADIATION" NUMBER(6,0) NOT NULL,
"SNOWDEPTH" NUMBER(6,0),
"SNOWWEQ" NUMBER(6,2),
"CLOUDCOVER" NUMBER(4,3) NOT NULL
Я разрабатываю код Python для выполнения этой задачи. У меня есть данные в фрейме данных Pandas df2, где все столбцы имеют то же имя, что и поля таблицы. Чтобы обеспечить правильную точность, я добавил этот оператор, прежде чем вызывать метод pandas «to_sql»:
df2 = df2.round({"TEMPERATURE_MAX": 1, "TEMPERATURE_MIN": 1, "TEMPERATURE_AVG": 1,
"TEMPERATURE_DEW": 1, "VAPOURPRESSURE": 2, "WINDSPEED": 1, "PRECIPITATION": 1,
"RADIATION": 0, "SNOWDEPTH": 0, "SNOWWEQ": 2, "CLOUDCOVER": 3}
)
df2.to_sql(name='MY_WEATHER_TABLE', con=engine, chunksize=1000, if_exists='append')
К вашему сведению: я использую механизм sqlalchemy для подключения к базе данных Oracle. К сожалению, кажется, что округление данных не дает ожидаемого результата. Мой вопрос: что я могу сделать в своем коде Python, чтобы решить эту проблему?
Исключение: (cx_Oracle.DatabaseError) ORA-01438: значение больше указанной точности, допустимой для этого столбца. [SQL: ВСТАВИТЬ В "ПОГОДА_ERA5_GRID_TEST" ("IDGRID", "ДАВЛЕНИЕ ПАР", "TEMPERATURE_AVG", "TEMPERATURE_DEW", "TEMPERATURE_MAX", "TEMPERATURE_MIN", "ОБЛАЧНОСТЬ", "SNOWWEQ", "СНЕЖНАЯ ГЛУБИНА", "ОСАДКИ", " РАДИАЦИЯ", "СКОРОСТЬ ВЕТРА", "ДЕНЬ") ЗНАЧЕНИЯ (:IDGRID, :VAPOURPRESSURE, :TEMPERATURE_AVG, :TEMPERATURE_DEW, :TEMPERATURE_MAX, :TEMPERATURE_MIN, :CLOUDCOVER, :SNOWWEQ, :SNOWDEPTH, :ОСАДКИ, :РАДИАЦИЯ, :WEINDSPEED, : ДЕНЬ)] [Параметры: [{ 'IDGRID': 904491077, 'VAPOURPRESSURE': +11,729999542236328, 'TEMPERATURE_AVG': -17,899999618530273, 'TEMPERATURE_DEW': -20,700000762939453, 'TEMPERATURE_MAX': -17,799999237060547, 'TEMPERATURE_MIN': -25,100000381469727, 'CLOUDCOVER': 0,9700000286102295 , 'SNOWWEQ': 8.399999618530273, 'SNOWDEPTH': 55.0, 'ОСАДКИ': 1.399999976158142, 'РАДИАЦИЯ': 379.0, 'СКОРОСТЬ ВЕТРА': 4.599999904632568, 'ДЕНЬ': datetime(20, 20, и т. д.): datetime(20, 20, 20):
Оказалось, что в моем коде для расчета давления пара была ошибка, что привело к значениям больше 99,99, и они не помещались в столбец, определенный как ЧИСЛО (4,2). Сообщение об ошибке от Oracle оттолкнуло меня из-за использованного в нем слова «точность». Таким образом, большое количество десятичных знаков, используемых в операторе INSERT, на самом деле не вызывало проблемы. Это означает, что не нужно было преобразовывать какой-либо столбец фрейма данных в десятичный тип. Решение состояло в том, чтобы исправить ошибку в расчете. В любом случае спасибо, Кристофер Джонс!
Проверьте документ cx_Oracle о точности чисел cx-oracle.readthedocs.io/en/latest/user_guide/….