Maison  >  Article  >  développement back-end  >  Méthodes simples et exemples de classes encapsulées pour exploiter la base de données Oracle en Python

Méthodes simples et exemples de classes encapsulées pour exploiter la base de données Oracle en Python

不言
不言original
2018-05-07 14:25:273574parcourir

Cet article présente principalement les méthodes simples et les classes d'encapsulation de Python pour faire fonctionner la base de données Oracle. Il analyse les opérations de base de connexion simple, de requête et d'arrêt de la base de données Oracle en Python avec des exemples, et fournit une encapsulation Python pour divers Opérations Oracle. Classe, les amis qui en ont besoin peuvent se référer à

Cet article décrit des méthodes simples et des classes d'encapsulation permettant à Python de faire fonctionner la base de données Oracle. J'aimerais le partager avec vous pour votre référence. Les détails sont les suivants :

Je suis récemment entré en contact avec Oracle au travail et j'ai découvert qu'il serait beaucoup plus pratique d'utiliser des scripts Python dans de nombreux endroits, je voulais donc d'abord apprendre la méthode de base pour faire fonctionner Oracle en Python.

Compte tenu de l'utilisation d'Oracle et de l'existence de NetConfig d'OracleClient, je pense que le connecter ne devrait pas être simple.

Effectivement, j'ai recherché plusieurs méthodes de connexion sur Internet, puis je l'ai dessiné pendant longtemps, mais je n'ai pas pu obtenir un scoop.

Méthode 1 : Nom d'utilisateur, mot de passe et surveillance comme paramètres respectivement

conn=cx_Oracle.connect('用户名','密码','数据库地址:数据库端口/SID')

D'après ce que j'ai vu Selon à cet article et aux conseils que j'ai donnés lors de l'écriture du code, j'ai trouvé que l'élément de configuration permettant à python de se connecter à la base de données devait être lié au fichier de configuration tnsnames.ora du client Oracle. Mais mes éléments de configuration n'avaient pas d'élément SID, et je ne savais pas ce qu'était le SID au début, j'ai juste suivi ce qui était écrit sur Internet, donc cette méthode a échoué. Plus tard, j'ai compris que je devais ajouter un SID à l'élément de configuration, puis j'ai réfléchi à la question de savoir si mon système devrait être redémarré une fois cet élément configuré. Alors, regardons d'abord d'autres méthodes….

Méthode 2 : le nom d'utilisateur, le mot de passe et la surveillance sont utilisés ensemble comme un seul paramètre

conn=cx_Oracle.connect('用户名/密码@数据库地址:数据库端口/SID')

Cette méthode est fondamentalement la même que la méthode 1, changer la soupe sans changer le médicament...

Méthode 3 : Utiliser les informations de configuration tns

conn=cx_Oracle.connect('用户名','密码',tns)

Le code sur Internet est utilisé pour obtenir tns, et le SID sera toujours utilisé, mais... les éléments de configuration que je peux déjà utiliser n'ont pas SID, donc j'utilise

tns=cx_Oracle.makedsn('数据库地址','数据库端口', 'SID')

Cela ne fonctionne toujours pas, mais regardez la méthode de génération de ce tns est similaire aux deux méthodes ci-dessus. Mais j'ai découvert que les données générées après la saisie aléatoire d'un SID sont comme ceci.

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SID=XE)))

Cependant, les éléments de configuration de mon client ressemblent à peu près à ceci,

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)( PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=KGDB)))

C'est parti, ils semblent être les mêmes, et les types sont tous des types de chaînes Essayez de les mettre directement dans mon. file Essayez d'attribuer les éléments de configuration à tns.

tns = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=KGDB)))'
conn = cx_Oracle.connect('nicker', '123456', tns)

Hmm. Succès~

Enfin, publiez un code complet d'utilisation de base

#coding:utf-8
import cx_Oracle
# 创建数据库连接
# cx_Oracle.connect('username','pwd','ora的tns信息')
# oracle数据库的tns信息,从tnsnames.ora中找到plsql可用的配置项,将该配置项直接拷贝过来即可
ora_tns = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=KGDB)))'
conn = cx_Oracle.connect('nicker', '123456', ora_tns)
# 操作游标
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT * FROM inst_info")
# 获取返回信息
rs = cursor.fetchall()
# 输出信息
for v in rs:
  print v
#关闭连接,释放资源
cursor.close()
conn.close()

L'observation et le résumé sont très importants , la compréhension nécessite également de

coller une classe qui encapsule Oracle

#coding:utf-8
import cx_Oracle
# 封装的类
class cxOracle:
  '''
  tns的取值tnsnames.ora对应的配置项的值,如:
  tns = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.16.18.23)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=MYDB)))'
  '''
  def __init__(self ,uname, upwd,tns ):
    self ._uname = uname
    self ._upwd = upwd
    self ._tns = tns
    self ._conn = None
    self ._ReConnect()
  def _ReConnect(self ):
    if not self._conn :
      self ._conn = cx_Oracle.connect (self. _uname, self ._upwd, self._tns)
    else:
      pass
  def __del__(self ):
    if self. _conn:
      self ._conn. close()
      self ._conn = None
  def _NewCursor(self ):
    cur = self. _conn.cursor ()
    if cur:
      return cur
    else:
      print "#Error# Get New Cursor Failed."
      return None
  def _DelCursor(self , cur):
    if cur:
      cur .close()
  # 检查是否允许执行的sql语句
  def _PermitedUpdateSql(self ,sql):
    rt = True
    lrsql = sql. lower()
    sql_elems = [ lrsql.strip ().split()]
    # update和delete最少有四个单词项
    if len( sql_elems) < 4 :
      rt = False
    # 更新删除语句,判断首单词,不带where语句的sql不予执行
    elif sql_elems[0] in [ &#39;update&#39;, &#39;delete&#39;]:
      if &#39;where&#39; not in sql_elems :
        rt = False
    return rt
  # 导出结果为文件
  def Export(self , sql, file_name, colfg =&#39;||&#39;):
    rt = self. Query(sql )
    if rt:
      with open( file_name, &#39;a&#39;) as fd:
        for row in rt:
          ln_info = &#39;&#39;
          for col in row:
             ln_info += str( col) + colfg
          ln_info += &#39;\n&#39;
          fd .write( ln_info)
  # 查询
  def Query(self , sql, nStart=0 , nNum=- 1):
    rt = []
    # 获取cursor
    cur = self. _NewCursor()
    if not cur:
      return rt
    # 查询到列表
    cur .execute(sql)
    if ( nStart==0 ) and (nNum==1 ):
      rt .append( cur.fetchone ())
    else:
      rs = cur. fetchall()
      if nNum==- 1:
        rt .extend( rs[nStart:])
      else:
        rt .extend( rs[nStart:nStart +nNum])
    # 释放cursor
    self ._DelCursor(cur)
    return rt
  # 更新
  def Exec(self ,sql):
    # 获取cursor
    rt = None
    cur = self. _NewCursor()
    if not cur:
      return rt
    # 判断sql是否允许其执行
    if not _PermitedUpdateSql(sql ):
      return rt
    # 执行语句
    rt = cur. execute(sql )
    # 释放cursor
    self ._DelCursor(cur)
    return rt
# 类使用示例
tns = &#39;(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.16.17.46)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=MYDB)))&#39;
ora = cxOracle (&#39;nicker&#39;, &#39;123456&#39;, tns)
# 导出结果为文件
rs = ora .Export("SELECT * FROM org", &#39;1.txt&#39;)
# 查询结果到列表
rs = ora.Query("SELECT * FROM org")
print rs
# 更新数据
ora.Exec("update org set org_name=&#39;NewNameForUpdate&#39; where org_id=123456;")

Connexe recommandations :

Explication détaillée de Python utilisant le module cx_Oracle pour faire fonctionner la base de données Oracle

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn