Дата вызова из текстового файла в SQL-запрос с использованием Python - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь ввести даты из внешнего текстового файла в SQL-запрос с использованием Python. Ниже приведен мой код:

import cx_Oracle
import pandas as pd
import numpy as np
dsn_tns = cx_Oracle.makedsn(ip, port,service_name = SERVICE_NAME)

db = cx_Oracle.connect('username', 'password', dsn_tns)
curs = db.cursor()

with open("Date.txt") as file:
log=file.read().splitlines()
import datetime
var1=datetime.datetime.strptime(log[0], "%d-%b-%Y %H:%M:%S").strftime("%d-%b-%Y %H:%M:%S")
var2=datetime.datetime.strptime(log[1], "%d-%b-%Y %H:%M:%S").strftime("%d-%b-%Y %H:%M:%S")

query = curs.execute("""SELECT * from table_name where cr_date >= TO_DATE(%s,'DD-MON-YYYY HH24:MI:SS') AND cr_date < to_date(%s,'DD-MON-YYYY HH24:MI:SS')""", (var1, var2))

from pandas import DataFrame
df = DataFrame(query.fetchall())

Здесь я соединяю свой запрос с Oracle, а затем пытаюсь вставить дату из Date.txt в SQL-запрос, который включает в себя две даты, как показано ниже:

27-DEC-2018 00:00:00
26-JAN-2019 00:00:00

Затем я хочу сохранить свой результат в dataframe df, но получить ошибку ниже при вставке дат из текстового файла.

Traceback (most recent call last): File "C:\Users\ab\Desktop\oracle_connect.py", line 24, in <module> AND cr_date < to_date(%s,'DD-MON-YYYY HH24:MI:SS')""", (var1, var2)) cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number

Пожалуйста, предложите мне, какие изменения мне нужно сделать для запуска этого кода. Также дайте мне знать, тянет ли мой dataframe df заголовок столбца, так как в настоящее время я вставляю заголовок столбца отдельно с другим кодом. Заранее спасибо

1 Ответ

0 голосов
/ 26 марта 2019

cx_oracle принимает переменную связывания sin в виде ": 1,: 2,: 3" или словарей.

попробуйте изменить место, где у вас есть "% s", чтобы переменные связывания были ": 1" и ": 2". Именно так я всегда делал привязки в оракуле. не уверен, что это решит все проблемы. достаньте "конечно".

Вы также можете сделать это с помощью словаря, чтобы он был ": val1" & ": val2", а затем передать словарь вместо списка вроде {"val1": "что-то", "val2": "что-то2 «}

...