最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python連接Oracle之環(huán)境配置、實例代碼及報錯解決方法詳解

 更新時間:2020年02月11日 15:30:57   作者:基基偉  
這篇文章主要介紹了Python連接Oracle之環(huán)境配置、實例代碼及報錯解決方法詳解,需要的朋友可以參考下

Oracle Client 安裝

1、環(huán)境

日期:2019年8月1日

公司已經(jīng)安裝好Oracle服務(wù)端

Windows版本:Windows10專業(yè)版

系統(tǒng)類型:64位操作系統(tǒng),基于x64的處理器

Python版本:Python 3.6.4 :: Anaconda, Inc.

2、下載網(wǎng)址

https://www.oracle.com/database/technologies/instant-client/downloads.html

3、解壓至目錄

解壓后(這里放D盤)

4、配置環(huán)境變量

控制面板\系統(tǒng)和安全\系統(tǒng) -> 高級系統(tǒng)設(shè)置 -> 環(huán)境變量

新建ORACLE_HOME,值為包解壓的路徑

編輯PATH,添加%ORACLE_HOME%

Navicat連接測試

cx_Oracle

安裝命令

conda install cx_Oracle

基礎(chǔ)代碼

import cx_Oracle
def execute(query):
 db = cx_Oracle.connect('用戶名/密碼@IP/ServiceName')
 cursor = db.cursor()
 cursor.execute(query)
 result = cursor.fetchall()
 cursor.close()
 db.close()
 return result
def commit(sql):
 db = cx_Oracle.connect('用戶名/密碼@IP/ServiceName')
 cursor = db.cursor()
 cursor.execute(sql)
 db.commit()
 cursor.close()
 db.close()

封裝成類

from cx_Oracle import Connection # conda install cx_Oracle
from conf import CONN, Color
class Oracle(Color):
 def __init__(self, conn=CONN):
  self.db = Connection(*conn, encoding='utf8') # 用戶名 密碼 IP/ServiceName
  self.cursor = self.db.cursor()
 def __del__(self):
  self.cursor.close()
  self.db.close()
 def commit(self, sql):
  try:
   self.cursor.execute(sql)
   self.db.commit()
  except Exception as e:
   self.red(e)
 def fetchall(self, query):
  self.cursor.execute(query)
  return self.cursor.fetchall()
 def fetchone(self, query, n=9999999):
  self.cursor.execute(query)
  for _ in range(n):
   one = self.cursor.fetchone()
   if one:
    yield one
 def fetchone_dt(self, query, n=9999999):
  self.cursor.execute(query)
  columns = [i[0] for i in self.cursor.description]
  length = len(columns)
  for _ in range(n):
   one = self.cursor.fetchone() # tuple
   yield {columns[i]: one[i] for i in range(length)}
 def read_clob(self, query):
  self.cursor.execute(query)
  one = self.cursor.fetchone()
  while one:
   try:
    yield one[0].read()
   except Exception as e:
    self.red(e)
   one = self.cursor.fetchone()
 def db2sheet(self, query, prefix):
  df = pd.read_sql_query(query, self.db)
  if 'url' in df.columns:
   df['url'] = "'" + df['url']
  df.to_excel(prefix.replace('.xlsx', '')+'.xlsx', index=False)
 def db2sheets(self, queries, prefix):
  writer = pd.ExcelWriter(prefix.replace('.xlsx', '')+'.xlsx')
  for sheet_name, query in queries.items():
   df = pd.read_sql_query(query, self.db)
   if 'url' in df.columns:
    df['url'] = "'" + df['url']
   df.to_excel(writer, sheet_name=sheet_name, index=False)
  writer.save()
 def tb2sheet(self, table):
  sql = "SELECT * FROM " + table
  self.db2sheet(sql, table)
 def insert(self, dt, tb):
  for k, v in dt.items():
   if isinstance(v, str):
    dt[k] = v.replace("'", '').strip()
  ls = [(k, v) for k, v in dt.items() if v is not None]
  sql = 'INSERT INTO %s (' % tb + ','.join(i[0] for i in ls) + \
    ') VALUES (' + ','.join('%r' % i[1] for i in ls) + ')'
  self.commit(sql)
 def insert_clob(self, dt, tb, clob):
  for k, v in dt.items():
   if isinstance(v, str):
    dt[k] = v.replace("'", '').strip()
  # 把超長文本保存在一個變量中
  # declare = "DECLARE variate CLOB := '%s';\n" % dt[clob]
  join = lambda x: '||'.join("'%s'" % x[10922*i: 10922*(i+1)] for i in range(len(x)//10922+1)) # 32768//3
  declare = "DECLARE variate CLOB := %s;\n" % join(dt[clob])
  dt[clob] = 'variate'
  ls = [(k, v) for k, v in dt.items() if v is not None]
  sql = 'INSERT INTO %s (' % tb + ','.join(i[0] for i in ls) + ') VALUES (' +\
    ','.join('%r' % i[1] for i in ls) + ');'
  sql = declare + 'BEGIN\n%s\nEND;' % sql.replace("'variate'", 'variate')
  self.commit(sql)
 def update(self, dt_update, dt_condition, table):
  sql = 'UPDATE %s SET ' % table + ','.join('%s=%r' % (k, v) for k, v in dt_update.items()) \
    + ' WHERE ' + ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
  self.commit(sql)
 def truncate(self, tb):
  self.commit('truncate table ' + tb)
db_read = Oracle()
fetchall = db_read.fetchall
fetchone = db_read.fetchone
read_clob = db_read.read_clob
if __name__ == '__main__':
 query = '''
 '''.strip()
 for i in fetchone(query, 99):
  print(i)

conf

CONN = ('用戶名', '密碼', 'IP/ServiceName')
conn = '用戶名/密碼@IP/ServiceName'

文本字符串查詢

class INSTR(Oracle):
 """文本字符串查詢"""
 def highlight_instr(self, table, field, keyword, clob=True):
  sql = "SELECT %s FROM %s WHERE INSTR(%s,'%s')>0" % (field, table, field, keyword)
  if clob:
   for i in self.read_clob(sql):
    self.highlight(i, keyword)
  else:
   for i, in self.fetchone(sql):
    self.highlight(i, keyword)
 def regexp_instr(self, table, field, pattern, regexp=True, clob=True):
  sql = "SELECT %s FROM %s WHERE INSTR(%s,'%s')>0" % (field, table, field, pattern)
  sql = sql.replace('INSTR', 'REGEXP_INSTR') if regexp else sql
  if clob:
   for i in self.read_clob(sql):
    yield i
  else:
   for i, in self.fetchone(sql):
    yield i

一個簡單的建表示例

-- 建表
CREATE TABLE table_name
(
serial_number  NUMBER(10),
collect_date  DATE,
url    VARCHAR2(255),
long_text   CLOB,
price    NUMBER(10)-- 若需要精確到小數(shù)點2位,按分存儲,/100還原到元
);
-- 給表添加備注
COMMENT ON TABLE table_name IS '中文表名';
-- 給表字段添加備注
COMMENT ON COLUMN table_name.serial_number IS '編號';
COMMENT ON COLUMN table_name.collect_date IS '日期';
COMMENT ON COLUMN table_name.url IS 'URL';
COMMENT ON COLUMN table_name.long_text IS '長文本';
COMMENT ON COLUMN table_name.price IS '價錢';
-- 插入
INSERT INTO table_name(collect_date) VALUES (DATE'2019-08-23');
INSERT INTO table_name(long_text) VALUES ('a');
INSERT INTO table_name(long_text) VALUES ('b');
-- 查詢
SELECT * FROM table_name WHERE TO_CHAR(long_text) in ('a','b');
-- 查建表語句(表名大寫)
SELECT dbms_metadata.get_ddl('TABLE','TABLE_NAME') FROM dual;
-- 刪表
DROP TABLE table_name;

sqlalchemy

import os # 解決【UnicodeEncodeError: 'ascii' codec can't encode character】問題
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'
# os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
from cx_Oracle import makedsn
from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 連接數(shù)據(jù)庫(ORA-12505: TNS:listener does not currently know of SID given in connect descriptor)
ip = ''
port = ''
tnsname = '' # 實例名
uname = '' # 用戶名
pwd = '' # 密碼
dsnStr = makedsn(ip, port, service_name=tnsname)
connect_str = "oracle://%s:%s@%s" % (uname, pwd, dsnStr)
# 創(chuàng)建連接引擎,這個engine是lazy模式,直到第一次被使用才真實創(chuàng)建
engine = create_engine(connect_str, encoding='utf-8')
# 創(chuàng)建對象的基類
Base = declarative_base()
class Student(Base):
 # 表名
 __tablename__ = 'student'
 # 表字段
 sid = Column(String(20), primary_key=True)
 age = Column(Integer)
# 建表(繼承Base的所有表)
Base.metadata.create_all(bind=engine)
# 使用ORM操作數(shù)據(jù)庫
Session = sessionmaker(bind=engine) # 創(chuàng)建ORM基類
session = Session() # 創(chuàng)建ORM對象
tb_obj = Student(sid='a6', age=18) # 創(chuàng)建表對象
session.add(tb_obj) # 添加到ORM對象(插入數(shù)據(jù))
session.commit() # 提交
session.close() # 關(guān)閉ORM對象
# 刪表(繼承Base的所有表)
Base.metadata.drop_all(engine)

報錯處理

DPI-1047: 64-bit Oracle Client library cannot be loaded

首先操作系統(tǒng)位數(shù)、python位數(shù)、cx_Oracle版本要對應(yīng)上;另外可能缺【Visual C++】

每次裝完后,要重啟pycharm和python

ORA-12170: TNS:Connect timeout occurred

打開終端ping一下

檢查【主機(jī)名或IP地址】、【服務(wù)名或SID】、【用戶名】和【密碼】是否填對

中文亂碼

encoding=‘utf8'

ORA-00972: identifier is too long

insert語句中出現(xiàn)'之類的字符

解決方法:將可能報錯的字符替換掉

ORA-64203: Destination buffer too small to hold CLOB data after character set conversion.

select TO_CHAR(long_text) from table_name,目標(biāo)緩沖區(qū)太小,無法儲存CLOB轉(zhuǎn)換字符后的數(shù)據(jù)

解決方法:不在SQL用TO_CHAR,改在Python中用read(如上代碼所示)

ORA-01704: string literal too long

雖然CLOB可以保存長文本,但是SQL語句有長度限制

解決方法:把超長文本保存在一個變量中(如上代碼所示)

PLS-00172: string literal too long

字符串長度>32767(215-1)

解決方法:使用'||'來連接字符串(如上代碼所示)

ORA-00928: missing SELECT keyword

INSERT操作時,表字段命名與數(shù)據(jù)庫內(nèi)置名稱沖突,如:ID、LEVEL、DATE等

解決方法:建立命名規(guī)范

cx_Oracle.DatabaseError: ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

使用sqlalchemy時的報錯

原因可能是目標(biāo)數(shù)據(jù)庫是集群部署的,可以咨詢一下DBA,或見上面代碼from cx_Oracle import makedsn

UnicodeEncodeError: 'ascii' codec can't encode character

使用sqlalchemy時的報錯,插入中文字符引起

解決方法是設(shè)置os.environ['NLS_LANG']

更多關(guān)于Python連接Oracle之環(huán)境配置、實例代碼及報錯解決方法請查看下面的相關(guān)鏈接

相關(guān)文章

  • python生成隨機(jī)密碼或隨機(jī)字符串的方法

    python生成隨機(jī)密碼或隨機(jī)字符串的方法

    這篇文章主要介紹了python生成隨機(jī)密碼或隨機(jī)字符串的方法,涉及Python字符串及隨機(jī)數(shù)的相關(guān)使用技巧,非常簡單實用,需要的朋友可以參考下
    2015-07-07
  • 在Django中使用MQTT的方法

    在Django中使用MQTT的方法

    這篇文章主要介紹了在Django中使用MQTT的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python正則表達(dá)式知識匯總

    Python正則表達(dá)式知識匯總

    本文介紹了Python正則表達(dá)式的相關(guān)基礎(chǔ)知識,本文的內(nèi)容不包括如何編寫高效的正則表達(dá)式、如何優(yōu)化正則表達(dá)式,這些主題請查看其他教程。
    2017-09-09
  • 對python sklearn one-hot編碼詳解

    對python sklearn one-hot編碼詳解

    今天小編就為大家分享一篇對python sklearn one-hot編碼詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python bmp轉(zhuǎn)換為jpg 并刪除原圖的方法

    python bmp轉(zhuǎn)換為jpg 并刪除原圖的方法

    今天小編就為大家分享一篇python bmp轉(zhuǎn)換為jpg 并刪除原圖的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python中的魔法函數(shù)和魔法屬性用法示例

    Python中的魔法函數(shù)和魔法屬性用法示例

    這篇文章主要介紹了Python中的魔法函數(shù)和魔法屬性的相關(guān)資料,Python的魔法函數(shù)也被稱為特殊方法或雙下劃線方法,是Python中一些特殊命名的函數(shù),它們以雙下劃線開頭和結(jié)尾,這些函數(shù)定義了對象在特定情況下的行為,需要的朋友可以參考下
    2024-11-11
  • python turtle 繪制太極圖的實例

    python turtle 繪制太極圖的實例

    今天小編就為大家分享一篇python turtle 繪制太極圖的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python使用描述器實現(xiàn)ORM模型的方法詳解

    Python使用描述器實現(xiàn)ORM模型的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Python描述器實現(xiàn)ORM模型,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Python+Pyqt實現(xiàn)簡單GUI電子時鐘

    Python+Pyqt實現(xiàn)簡單GUI電子時鐘

    這篇文章主要為大家詳細(xì)介紹了Python+Pyqt實現(xiàn)簡單GUI電子時鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • python自定義線程池控制線程數(shù)量的示例

    python自定義線程池控制線程數(shù)量的示例

    今天小編就為大家分享一篇python自定義線程池控制線程數(shù)量的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02

最新評論

买车| 措美县| 阿图什市| 芦山县| 阳山县| 抚松县| 静海县| 崇仁县| 大荔县| 娄烦县| 蓬莱市| 安仁县| 南江县| 仙桃市| 易门县| 大荔县| 九龙坡区| 澄城县| 乌兰察布市| 南江县| 新乡县| 广饶县| 阳春市| 新泰市| 屏山县| 南雄市| 汉寿县| 景德镇市| 德江县| 蒙山县| 宁津县| 多伦县| 秀山| 湟源县| 邵阳县| 连江县| 北流市| 明溪县| 定边县| 松原市| 潜江市|