استرداد الطابع الزمني لـ Oracle باستخدام وحدة Python Win32 ODBC

StackOverflow https://stackoverflow.com/questions/38435

  •  09-06-2019
  •  | 
  •  

سؤال

بالنظر إلى جدول Oracle الذي تم إنشاؤه باستخدام ما يلي:

CREATE TABLE Log(WhenAdded TIMESTAMP(6) WITH TIME ZONE);

باستخدام وحدة Python ODBC من ملحقات Win32 (من الحزمة win32all)، قمت بتجربة ما يلي:

import dbi, odbc

connection = odbc.odbc("Driver=Oracle in OraHome92;Dbq=SERVER;Uid=USER;Pwd=PASSWD")

cursor = connection.cursor()
cursor.execute("SELECT WhenAdded FROM Log")

results = cursor.fetchall()

عندما أقوم بتشغيل هذا، أحصل على ما يلي:

Traceback (most recent call last):
...
    results = cursor.fetchall()
dbi.operation-error: [Oracle][ODBC][Ora]ORA-00932: inconsistent datatypes: expected %s got %s 
in FETCH

أنواع البيانات الأخرى التي جربتها (VARCHAR2، BLOB) لا تسبب هذه المشكلة.هل هناك طريقة لاسترجاع الطوابع الزمنية؟

هل كانت مفيدة؟

المحلول

أعتقد أن هذا خطأ في برنامج تشغيل Oracle ODBC.بشكل أساسي، لا يدعم برنامج تشغيل Oracle ODBC TIMESTAMP WITH (LOCAL) TIME ZONE أنواع البيانات، فقط TIMESTAMP نوع البيانات.كما اكتشفت، أحد الحلول هو في الواقع استخدام TO_CHAR طريقة.

في المثال الخاص بك، أنت لا تقرأ فعليًا معلومات المنطقة الزمنية.إذا كان لديك السيطرة على الجدول يمكنك تحويله إلى مستقيم TIMESTAMP عمود.إذا لم يكن لديك القدرة على التحكم في الجدول، فقد يكون الحل الآخر هو إنشاء طريقة عرض يتم التحويل منها TIMESTAMP WITH TIME ZONE ل TIMESTAMP عبر سلسلة - آسف، لا أعرف إذا كانت هناك طريقة للتحويل مباشرة من TIMESTAMP WITH TIME ZONE ل TIMESTAMP.

نصائح أخرى

الحل الذي أرجو أن يكون أفضل، هو استخدام Oracle لتحويل الطابع الزمني بشكل صريح إلى سلسلة:

cursor.execute("SELECT TO_CHAR(WhenAdded, 'YYYY-MM-DD HH:MI:SSAM') FROM Log")

هذا يعمل، لكنه ليس محمولاً.أرغب في استخدام نفس البرنامج النصي Python مقابل قاعدة بيانات SQL Server، لذلك لن يعمل الحل الخاص بـ Oracle (مثل TO_CHAR).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top