#python #pandas #cx-oracle #strptime
#python #pandas #cx-oracle #strptime
Вопрос:
Я пытаюсь ввести даты из внешнего текстового файла в 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:UsersabDesktoporacle_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. попробуйте изменить место, где у вас есть «% s», чтобы переменные bind были «: 1» и «: 2». Именно так я всегда делал привязки в oracle. не уверен, что это исправит какие-либо проблемы. конечно, уберите «s».
2. Это работает… Спасибо Jacobr365
3. рад помочь. примите ответ, пожалуйста.
Ответ №1:
cx_oracle принимает переменную привязки в виде «:1 , :2, :3» или словари.
попробуйте изменить место, где у вас есть «% s», чтобы переменные bind были «: 1» и «: 2». Именно так я всегда делал привязки в oracle. не уверен, что это исправит какие-либо проблемы. конечно, уберите «s».
вы также могли бы сделать это со словарем и сделать его «:val1» и «: val2», а затем передать в словаре вместо списка типа {«val1»: «что-то», «val2»: «что-то2»}