연결 문자열에서 서비스 이름 대신 SID를 사용하면 cx_Oracle이 연결되지 않음
이렇게 생긴 연결 문자열이 있습니다.
con_str = "myuser/mypass@oracle.sub.example.com:1521/ora1"
서 ★★★★★ora1
SID를 사용SQL Developer에서 이 정보를 사용하면 문제 없이 연결 및 쿼리할 수 있습니다.
그러나 이 문자열을 사용하여 Oracle에 연결하려고 하면 실패합니다.
cx_Oracle.connect(con_str)
DatabaseError: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
은, 이 경우, 이이 작동합니다.ora1
서비스 이름입니다.
문제의 반대라고 생각되는 다른 질문도 있습니다(SID에서는 동작하지만 서비스명은 동작하지 않습니다).
하여 Oracle에 방법은 무엇입니까?cx_Oracle
SID
서비스명은요?이 작업을 하려면 어떻게 해야 합니까?TNSNAMES.ORA
으로 많은 되어 일?에 있습니까? 내 응용 프로그램이 내부적으로 많은 사용자에게 배포되고 변경되는 경우TNSNAMES
Windows 머신에서 관리자 권한이 없는 사용자를 취급하는 경우, 파일은 그다지 이상적이지 않습니다. 이 해.
마찬가지로 를 사용하여 지정된 DSN 문자열을 생성하여 데이터베이스에 연결할 수 있었습니다.SID
(그냥)
dsnStr = cx_Oracle.makedsn("oracle.sub.example.com", "1521", "ora1")
이것은 다음과 같은 것을 반환합니다.
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle.sub.example.com)(PORT=1521)))(CONNECT_DATA=(SID=ora1)))
를 사용하여 데이터베이스에 접속할 수 있습니다.
con = cx_Oracle.connect(user="myuser", password="mypass", dsn=dsnStr)
print con.version
con.close()
SID 대신 service_name을 지정하는 방법을 찾고 있는 사용자에게 적합합니다.
SQLChemy 1.0.0b1용 changelog(2015년 3월 13일 출시):
[ [ ][ oracle ][ feature ] 를 전달함으로써
?service_name=<name>
URL 입니다. 스와워미르 엘레르트
이 변경에서는 다음과 같은 연결 문자열을 구축하기 위해 사용할 수 있는 Oracle 방언 고유의 새로운 옵션이 도입되었습니다.
from sqlalchemy import create_engine
from sqlalchemy.engine import url
connect_url = url.URL(
'oracle+cx_oracle',
username='some_username',
password='some_password',
host='some_host',
port='some_port',
query=dict(service_name='some_oracle_service_name'))
engine = create_engine(connect_url)
sqlalchemy 및 ORACLE 12를 사용하는 경우 다음 기능이 작동합니다.
from sqlalchemy import create_engine
con='oracle://user:password@hostname:1521/?service_name=DDDD'
engine = create_engine(con)
SID가 아닌 서비스 이름을 사용해야 합니다.이유는 모르겠지만 SID를 사용하는 간단한 연결 문자열은 작동하지 않습니다.
아직 동작하지 않을 수 있습니다.dnStr의 출력을 가져와 SID를 SERVICE_NAME으로 대체하여 문자열을 수정하고 해당 변수를 con 문자열에 사용해야 합니다.이 시술은 나에게 효과가 있었다.
SID에 쉽게 접근할 수 없거나 데이터베이스에 대해 SID가 작성되지 않았을 수 있습니다.
제 경우 클라이언트 측에서 클라우드 데이터베이스에 대한 액세스를 요청하고 있기 때문에 SID를 생성하는 것은 의미가 없었습니다.
대신 다음과 같은 문자열이 있을 수 있습니다.
"(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = something.cloud.company)
(PORT = 12345)) (ADDRESS = (PROTOCOL = TCP)(HOST = something.cloud.company)
(PORT = 12345)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =
something.company)))"
SID를 교체하는 데 사용할 수 있습니다.
connection = cx_Oracle.connect("username", "pw", "(DESCRIPTION = (ADDRESS =
(PROTOCOL = TCP)(HOST = something.cloud.company)(PORT = 12345)) (ADDRESS =
(PROTOCOL = TCP)(HOST = something.cloud.company)(PORT = 12345))
(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = something.company)))")
한동안은 Magic SQL을 사용할 수 없을 거라고 생각했습니다.%sql
,%%sql
cx_Oracle.connect()에서 상기의 대체 방법을 사용해야 하는 접속의 서비스명 문제 때문입니다.cx_Oracle.makedsn()...
드디어 유효한 솔루션을 찾았습니다.서비스명의 변수를 먼저 선언하고 설정한 후 명령어로 사용합니다(서비스명의 리터럴 문자열이 명령어에 입력되어 있으면 동작하지 않기 때문입니다).
import cx_Oracle
user='youruser'
pwd='youruserpwd'
dbhost='xx.xx.xx.xx'
service='yourservice'
%load_ext sql
%sql oracle+cx_oracle://$user:$pwd@$dbhost:1521/?service_name=$service
output(접속 성공 시 얻을 수 있는 것):
u'Connected: youruser@'
cx_oracle의 oracle.jdbc.proxyClientName 속성을 설정하고 proxyClient를 사용하여 연결하려는 경우 다음을 사용할 수 있습니다.
cx_Oracle.init_oracle_client("../../oracle_local_client", config_dir= "../../oracle_local_client/network/admin")
connectDsn = cx_Oracle.makedsn('db.svr.net', 'portNumberHere',service_name="TEST_READWRITE")
#replace all prams above
pool = cx_Oracle.SessionPool(externalauth=True, homogeneous=False, dsn = connectDsn)
connection = pool.acquire(user="[PROXY_CLIENT_NAME]")
사용자가 proxyClient임을 나타내기 위해 '[' 중괄호를 사용합니다.Kerberos 인증을 사용하고 있으며 SQLNET.ora 파일에는 다음 속성이 포함되어 있습니다.
NAMES.DIRECTORY_PATH=(TNSNAMES,HOSTNAME,EZCONNECT)
SQLNET.AUTHENTICATION_SERVICES = (BEQ,KERBEROS5PRE,KERBEROS5)
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle
SQLNET.KERBEROS5_CC_NAME=OSMSFT:
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.KERBEROS5_CONF=I:\projects\poc\resources\krb5.conf # krb5 config file complete path.
상세한 것에 대하여는, 이 문서의 비디오를 참조해 주세요.
나도 이 문제를 만났다.해결책은 다음과 같습니다.
1: get the service name at tnsnames.ora
2: put the service name in
con_str = "myuser/mypass@oracle.sub.example.com:1521/ora1"
언급URL : https://stackoverflow.com/questions/24149138/cx-oracle-doesnt-connect-when-using-sid-instead-of-service-name-on-connection-s
'programing' 카테고리의 다른 글
.env 파일 변수를 웹 팩 구성에 전달하려면 어떻게 해야 합니까? (0) | 2023.03.29 |
---|---|
Unix 쉘 스크립트에서 읽을 수 있는 JSON 형식으로 컬 출력 표시 (0) | 2023.03.29 |
일부 유명 프로그램이 항상 인쇄를 사용하는 이유 (0) | 2023.03.29 |
브라우저 콘솔에서 앵귤러 함수를 호출하다 (0) | 2023.03.19 |
Mailchimp API v3를 사용하여 목록에 가입자 추가 (0) | 2023.03.19 |