簡體   English   中英

使用python連接遠程主機中的sqlplus並執行sql命令

[英]Use python to connect to sqlplus in a remote host and execute sql commands

這是我的情況:我們在遠程機器上設置了 sqlplus,我想連接到該遠程機器,然后運行 ​​sqlplus 來執行 sql 查詢。 我正在嘗試編寫一個 python 腳本來做到這一點。

這是我的代碼:

import sys

import getpass

import paramiko

import time

user=raw_input('Enter User Name :')

 #host_name=raw_input('Enter Host Name:')

psswd=getpass.getpass()

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('xxx.hostname.xxx',port=22, username=user, password=psswd)

command='export ORACLE_HOME=/opt/app/oracle/product/10.2.0.2/client export LD_LIBRARY_PATH=$ORACLE_HOME/lib \
 sudo -S -H /XX/XX/XX/bin/sqlplus'



print 'running remote command'

print(command) 

stdin, stdout, stderr=ssh.exec_command(command)

stdin.write(psswd+'\n')

stdin.flush()

for out in stdout.readlines():

    print out

ssh.close() 

我在這里有兩個問題首先是我是否通過這樣的命令

'export ORACLE_HOME=/opt/app/oracle/product/10.2.0.2/client export LD_LIBRARY_PATH=$ORACLE_HOME/lib \
sudo -S -H /XX/XX/XX/bin/sqlplus' +' echo $ORACLE_HOME'

即使我添加了 echo ,我也會得到一個空的響應,這意味着變量設置不正確。

其次,我不知道接下來要做什么。 如何向 sqlplus 提供username/password以允許執行 sql 查詢,然后如何提供 sql 語句。

我和你有類似的問題,最終寫了一個庫來做到這一點。 這是“偽偽代碼”的一個片段,它應該為您指明正確的方向。 請記住,這些是類的方法,您需要根據需要調整此偽代碼。 請記住,您在這里已經需要來自 paramiko 的 SSHConnection。

   def sqlplus_cmd(self, command):
        # Create string which exports environmental variables from OracleEnv class ()
        if 'CYGWIN' not in <return from 'uname' on the host>:
            # If NOT Cygwin, concatenate environmental variable exports
            oracle_exports = 'export PATH={0}:$PATH;' \
                             'export ORACLE_HOME={1};' \
                             'export ORACLE_SID={2}'.format(<oracle_path>, <oracle_home>, <oracle_sid>)
        else:
            # If Cygwin, need to source environmental variables for shell session from script
            # TODO: May need to get Oracle Home and Path as well for some systems.
            self.cmd('echo "export ORACLE_SID={0}" > /tmp/sid'.format(<oracle_sid>))
            oracle_exports = 'source /tmp/sid'

        # Issue concatinated one line command which exports variables, opens sqlplus, and issues a sqlplus statement
        # final_command = oracle_exports + ';' + 'echo "' + command + '" | sqlplus -S / as sysdba'
        final_command = '{0};echo "{1}" | sqlplus -S / as sysdba'.format(oracle_exports, command)
        stdout, stderr, rc = <paramiko_SSHConnection.exec_command>(final_command)

那應該這樣做。 解析輸出並捕獲標准輸出中的 ORA-xxx 和 SP2-xxx 錯誤,玩得開心。

你為什么不把你的命令拆分成一個函數,並使用 subprocess.Popen() 在一個子進程中執行它?

from subprocess import *

def run_sql_query(sql_command, connection_string):
    session = Popen(['sqlplus', '-S', connection_string], stdin=PIPE, stdout=PIPE, stderr=PIPE)
    session.stdin.write(sql_command)
    return session.communicate()

然后你可以將你的連接字符串和命令作為參數傳遞給你的函數:

con_str = 'xxx.hostname.xxx',port=22, username=user, password=psswd'
cmd = ''export ORACLE_HOME=/opt/app/oracle/product/10.2.0.2/client export LD_LIBRARY_PATH=$ORACLE_HOME/lib sudo -S -H /apollo/env/envImprovement/bin/sqlplus'

print(run_sql_query(con_str, cmd))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM