Série: Introduction à cx_Oracle Contents
--Utilisation d'Oracle Cloud
Veuillez créer le tableau suivant.
sample17.sql
create table sample17(
col_date date
, col_ts timestamp(9)
, col_tz timestamp(9) with time zone
);
Comme expliqué dans 6th et 9th, type DATE Le type Python correspondant pour est datetime.datetime. Pour le type DATE, vous pouvez échanger avec DB normalement en le passant à datetime.datetime. En outre, datetime.datetime peut gérer des valeurs allant jusqu'à microsecondes, mais le type DATE ne peut gérer que des valeurs allant jusqu'à secondes, de sorte que les valeurs inférieures à secondes sont tronquées. Vous trouverez ci-dessous des exemples et des résultats d'exécution. J'obtiens la valeur qui a été avancée d'un jour au moment de SELECT afin que je puisse voir qu'elle se réfère à une valeur différente.
sample17a.py
import cx_Oracle
import datetime
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL1 = "insert into sample17(col_date) values(:now)"
SQL2 = "select col_date + 1 from sample17"
sys_date = datetime.datetime.now()
print("Valeur AP:", sys_date)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as conn:
with conn.cursor() as cur:
cur.execute("truncate table sample17")
cur.execute(SQL1, [sys_date])
conn.commit()
val = cur.execute(SQL2).fetchone()[0]
print("Valeur DB:", val.strftime("%Y-%m-%d %H:%M:%S.%f"))
$ python sample17a.py
Valeur AP: 2020-09-26 10:48:02.605423
Valeur DB: 2020-09-27 10:48:02.000000
Comme le type DATE, le type TIMESTAMP prend également en charge le type Python datetime.datetime. Cependant, INSERT nécessite un codage supplémentaire par rapport au type DATE. Si le codage est le même que le type DATE, il sera traité de la même manière que le type DATE et les valeurs inférieures à une seconde seront tronquées. En ce moment,
Est requis. Vous trouverez ci-dessous des exemples et des résultats d'exécution. Notez que l'instruction SQL qui avance d'un jour utilise INTERVAL contrairement au type DATE car si elle est "+1", elle sera convertie en type DATE et les valeurs inférieures à secondes seront tronquées.
sample17b.py
import cx_Oracle
import datetime
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL1 = "insert into sample17(col_ts) values(:now)"
SQL2 = "select col_ts + interval '1' day from sample17"
sys_date = datetime.datetime.now()
print("Valeur AP:", sys_date)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as conn:
with conn.cursor() as cur:
cur.execute("truncate table sample17")
cur.prepare(SQL1)
cur.setinputsizes(now=cx_Oracle.DB_TYPE_TIMESTAMP)
cur.execute(None, {"now":sys_date})
conn.commit()
val = cur.execute(SQL2).fetchone()[0]
print("Valeur DB:", val.strftime("%Y-%m-%d %H:%M:%S.%f"))
$ python sample17b.py
Valeur AP: 2020-09-26 23:51:27.832640
Valeur DB: 2020-09-27 23:51:27.832640
Ces types de données peuvent être traités avec le même codage que le type TIMESTAMP. Définissez les types spécifiés par Cursor.setinputsizes () sur cx_Oracle.DB_TYPE_TIMESTAMP_TZ et cx_Oracle.DB_TYPE_TIMESTAMP_LTZ, respectivement. Cependant, au moment de l'écriture, il est possible de mettre à jour en définissant une date-heure d'acquisition au lieu de native, mais dans le cas de SELECT, les informations de fuseau horaire seront perdues car elles seront reçues à la date-heure native. Pour autant que je vérifie le manuel, malheureusement, il semble que même si j'utilise Curosr.var (), il n'y a pas de paramètre pour recevoir avec datetime conscient. Par conséquent, lorsque vous utilisez ces types de données, ne vous attendez pas à ce que cx_Oracle absorbe la différence de fuseau horaire et code avec Python ou SQL en tenant compte de la différence de fuseau horaire (calculez la différence de fuseau horaire par vous-même). Ou essayez de passer entre Python et SQL via une chaîne (par exemple format ISO 8601). Voici un exemple d'utilisation de la chaîne de date au format ISO 8601.
sample17c.py
import cx_Oracle
import datetime
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL1 = "insert into sample17(col_tz) values(to_utc_timestamp_tz(:now))"
SQL2 = f"select to_char(col_tz + interval '1' day, 'YYYY-MM-DD\"T\"HH24:MI:SS.ff6\"Z\"') from sample17"
sys_date = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()
print("Valeur AP:", sys_date)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as conn:
with conn.cursor() as cur:
cur.execute("truncate table sample17")
cur.execute(SQL1, [sys_date])
conn.commit()
val = cur.execute(SQL2).fetchone()[0]
print("Valeur DB:", val)
$ python sample17c.py
Valeur AP: 2020-09-27T07:05:42.948348+00:00
Valeur DB: 2020-09-28T07:05:42.948348Z
Recommended Posts