【问题标题】:Use python to connect to sqlplus in a remote host and execute sql commands使用python连接远程主机中的sqlplus并执行sql命令
【发布时间】:2015-05-21 11:15:06
【问题描述】:

这是我的情况: 我们在远程机器上设置了 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,我也得到一个空响应,这意味着变量设置不正确。

其次,我不知道接下来该做什么。如何将username/password提供给sqlplus以允许执行sql查询,然后如何提供sql语句。

【问题讨论】:

    标签: python oracle python-2.7 ssh paramiko


    【解决方案1】:

    你为什么不把你的命令拆分成一个函数,然后用 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))
    

    【讨论】:

      【解决方案2】:

      我遇到了和你类似的问题,最终写了一个库来解决这个问题。这是'psuedo psuedo code'的sn-p,它应该为您指明正确的方向。 请记住,这些是类的方法,您需要根据需要调整此伪代码。请记住,您在这里已经需要来自 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 错误的乐趣。

      【讨论】:

        猜你喜欢
        • 2013-12-31
        • 2013-09-28
        • 2020-03-20
        • 1970-01-01
        • 2015-11-20
        • 2020-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多