日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python查询最高分_精通 Oracle+Python,第 1 部分:查询最佳应践

發(fā)布時(shí)間:2025/3/15 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python查询最高分_精通 Oracle+Python,第 1 部分:查询最佳应践 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:Przemyslaw Piotrowski

首先,熟悉 Oracle-Python

連接性的基本概念

2007 年 9 月發(fā)布

參見(jiàn)系列目錄

在 Python 做事方式的核心原則中,有一個(gè)規(guī)定是要求具有到 API 的高級(jí)接口。數(shù)據(jù)庫(kù) API(在此例中為 Oracle

API)就是一個(gè)例子。使用 Computronix 的 cx_Oracle Python 模塊,您可以在維持與 Python 數(shù)據(jù)庫(kù)

API 規(guī)范 v2.0 的兼容性的同時(shí),控制 Oracle 的查詢模型。

對(duì)于所有遵循該規(guī)范的客戶端庫(kù)而言,使用 DB API 2.0 查詢數(shù)據(jù)庫(kù)的模型都是一致的。在此基礎(chǔ)上,cx_Oracle

的主要開(kāi)發(fā)人員 Anthony Tuininga 添加了一組豐富的屬性和方法,以向開(kāi)發(fā)人員揭示 Oracle

獨(dú)有的特性。僅用標(biāo)準(zhǔn)的方法而忘掉“額外的”方法是絕對(duì)可能的,但在本文中您不會(huì)這么做。通用數(shù)據(jù)庫(kù)包裝這一概念可能在某些情況下起作用,但與此同時(shí),您會(huì)失去

RDBMS 提供的所有優(yōu)化。

DB API 2.0 和 cx_Oracle 介紹

Python 數(shù)據(jù)庫(kù) API 規(guī)范 v2.0

是集體努力的成果,用于統(tǒng)一不同數(shù)據(jù)庫(kù)系統(tǒng)的訪問(wèn)模型。擁有一組相對(duì)較少的方法和屬性,在更換數(shù)據(jù)庫(kù)供應(yīng)商時(shí)就易于學(xué)習(xí)并保持一致。它不以任何方式將數(shù)據(jù)庫(kù)對(duì)象映射到

Python 結(jié)構(gòu)中。用戶仍然需要手工編寫(xiě) SQL。在更換到另一數(shù)據(jù)庫(kù)后,此 SQL

可能需要重新編寫(xiě)。盡管如此,它還是出色妥善地解決了 Python 數(shù)據(jù)庫(kù)的連接性問(wèn)題。

該規(guī)范定義了 API 的各個(gè)部分,如模塊接口、連接對(duì)象、游標(biāo)對(duì)象、類型對(duì)象和構(gòu)造器、DB API

的可選擴(kuò)展以及可選的錯(cuò)誤處理機(jī)制。

數(shù)據(jù)庫(kù)和 Python 語(yǔ)言之間的網(wǎng)關(guān)是連接對(duì)象。它包含制作數(shù)據(jù)庫(kù)驅(qū)動(dòng)的應(yīng)用程序所需的全部組件,不僅符合 DB API

2.0,而且是規(guī)范方法和屬性的一個(gè)超集。在多線程的程序中,模塊和連接可以在不同線程間共享,但是不支持游標(biāo)共享。這一限制通常是可接受的,因?yàn)楣蚕碛螛?biāo)可能帶來(lái)死鎖風(fēng)險(xiǎn)。

Python 大量使用了異常模型,DB API

定義了若干標(biāo)準(zhǔn)異常,它們?cè)谡{(diào)試應(yīng)用程序中的問(wèn)題時(shí)會(huì)非常有用。下面是一些標(biāo)準(zhǔn)異常,同時(shí)提供了原因類型的簡(jiǎn)要說(shuō)明:

Warning — 數(shù)據(jù)在執(zhí)行插入操作時(shí)被截?cái)?#xff0c;等等

Error — 這里提到的除 Warning 外的所有異常的基類。

InterfaceError — 數(shù)據(jù)庫(kù)接口而非數(shù)據(jù)庫(kù)本身故障(本例為 cx_Oracle

問(wèn)題)

DatabaseError — 嚴(yán)格意義上的數(shù)據(jù)庫(kù)問(wèn)題

DataError — 包含如下結(jié)果數(shù)據(jù)的問(wèn)題除數(shù)為 0,值超出范圍等

OperationalError —

與編程人員無(wú)關(guān)的數(shù)據(jù)庫(kù)錯(cuò)誤:連接丟失、內(nèi)存分配錯(cuò)誤、事務(wù)處理錯(cuò)誤等

IntegrityError — 數(shù)據(jù)庫(kù)的關(guān)系完整性受到了影響,例如,外鍵約束失敗

InternalError — 數(shù)據(jù)庫(kù)遇到內(nèi)部錯(cuò)誤,例如,游標(biāo)無(wú)效、事務(wù)不同步

ProgrammingError — 未找到表、SQL

語(yǔ)句中的語(yǔ)法錯(cuò)誤、指定參數(shù)的數(shù)量錯(cuò)誤等

NotSupportedError — 調(diào)用的 API 部件并不存在

連接過(guò)程首先從連接對(duì)象開(kāi)始,這是創(chuàng)建游標(biāo)對(duì)象的基礎(chǔ)。除游標(biāo)操作外,連接對(duì)象還使用 commit() 和 rollback()

方法對(duì)事務(wù)進(jìn)行管理。執(zhí)行 SQL 查詢、發(fā)出 DML/DCL 語(yǔ)句和獲取結(jié)果這些過(guò)程均受游標(biāo)控制。

在游標(biāo)和連接類的實(shí)現(xiàn)中,cx_Oracle 對(duì)標(biāo)準(zhǔn)的 DB API 2.0

規(guī)范進(jìn)行了最大程度的擴(kuò)展。如果需要,所有這些擴(kuò)展都將在文本中清楚地標(biāo)記。

入門

在使用查詢和游標(biāo)之前,首先需要建立數(shù)據(jù)庫(kù)連接。提供憑證和數(shù)據(jù)源名稱的方法有多種,其結(jié)果都是相似的。在從下面的 Python

交互式會(huì)話提取的內(nèi)容中,連接對(duì)象 db、db1 和 db2 都是等同的。makedsn() 函數(shù)根據(jù)給定的參數(shù)值創(chuàng)建一個(gè) TNS

條目。此處將它賦值給變量 dsn_tns。如果環(huán)境設(shè)置得當(dāng),您可以使用更短的形式

cx_Oracle.connect('hr/hrpwd'),從而省略用于 db 和 db1 的簡(jiǎn)單連接字符串。

>>>

import cx_Oracle

>>> db =

cx_Oracle.connect('hr', 'hrpwd', 'localhost:1521/XE')

>>> db1 =

cx_Oracle.connect('hr/hrpwd@localhost:1521/XE')

>>> dsn_tns =

cx_Oracle.makedsn('localhost', 1521, 'XE')

>>> print

dsn_tns

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

>>> db2 =

cx_Oracle.connect('hr', 'hrpwd', dsn_tns)

在連接對(duì)象的作用域內(nèi)(如分配給上面的 db 變量的連接對(duì)象),您可以通過(guò)查詢版本屬性獲得數(shù)據(jù)庫(kù)版本(這是 DB API 2.0

的一個(gè)擴(kuò)展)。這可以用于使 Python 程序依賴于具體版本的 Oracle 產(chǎn)品。同樣地,您可以通過(guò)查詢 dsn

屬性獲得連接的連接字符串。

>>>

print db.version

10.2.0.1.0

>>> versioning =

db.version.split('.')

>>> print

versioning

['10', '2', '0', '1', '0']

>>> if

versioning[0]=='10':

... print "Running 10g"

... elif versioning[0]=='9':

... print "Running 9i"

...

Running 10g

>>> print

db.dsn

localhost:1521/XE

游標(biāo)對(duì)象

您可以使用連接對(duì)象的 cursor()

方法定義任意數(shù)量的游標(biāo)。簡(jiǎn)單的程序使用一個(gè)游標(biāo)就可以了,該游標(biāo)可以一再地重復(fù)使用。但較大的項(xiàng)目可能要求幾個(gè)不同的游標(biāo)。

>>>

cursor = db.cursor()

應(yīng)用程序邏輯通常需要明確區(qū)分針對(duì)數(shù)據(jù)庫(kù)發(fā)出的語(yǔ)句的各個(gè)處理階段。這有助于更好地理解性能瓶頸并編寫(xiě)更快且經(jīng)過(guò)優(yōu)化的代碼。語(yǔ)句處理分三個(gè)階段:

分析(可選)

cx_Oracle.Cursor.parse([statement])

實(shí)際上并不需要調(diào)用,因?yàn)樵趫?zhí)行階段會(huì)自動(dòng)分析 SQL 語(yǔ)句。該方法可以用于在執(zhí)行語(yǔ)句前對(duì)其進(jìn)行驗(yàn)證。當(dāng)這類語(yǔ)句中檢測(cè)出錯(cuò)誤時(shí),會(huì)引發(fā)

DatabaseError 異常,相應(yīng)的錯(cuò)誤消息通常可能是“ORA-00900:invalid SQL statement,

ORA-01031:insufficient privileges or ORA-00921:unexpected end of

SQL command.”

執(zhí)行

cx_Oracle.Cursor.execute(statement, [parameters],

**keyword_parameters)此方法可以接受單個(gè)參數(shù) — 一條 SQL 語(yǔ)句 —

直接針對(duì)數(shù)據(jù)庫(kù)來(lái)運(yùn)行。通過(guò) parameters 或 keyword_parameters

參數(shù)賦值的綁定變量可以指定為字典、序列或一組關(guān)鍵字參數(shù)。如果已經(jīng)提供了字典或關(guān)鍵字參數(shù),那么這些值將與名稱綁定。如果給出的是序列,將根據(jù)這些值的位置對(duì)它們進(jìn)行解析。如果是查詢操作,此方法返回一個(gè)變量對(duì)象列表;如果不是,則返回

None。

cx_Oracle.Cursor.executemany(statement,

parameters)對(duì)于批量插入尤其有用,因?yàn)樗梢詫⑺璧?Oracle

執(zhí)行操作的數(shù)量限制為僅一個(gè)。有關(guān)如何使用該方法的詳細(xì)信息,請(qǐng)參見(jiàn)下面的“一次多行”部分。

獲取(可選)— 僅用于查詢(因?yàn)?DDL 和 DCL

語(yǔ)句不返回結(jié)果)。在不執(zhí)行查詢的游標(biāo)上,這些方法將引發(fā) InterfaceError 異常。

cx_Oracle.Cursor.fetchall()

以字節(jié)組列表形式獲取結(jié)果集中的所有剩余行。如果沒(méi)有剩余的行,它返回一個(gè)空白列表。獲取操作可以通過(guò)設(shè)置游標(biāo)的 arraysize

屬性進(jìn)行調(diào)整,該屬性可設(shè)置在每個(gè)底層請(qǐng)求中從數(shù)據(jù)庫(kù)中返回的行數(shù)。arraysize

的設(shè)置越高,需要在網(wǎng)絡(luò)中往返傳輸?shù)拇螖?shù)越少。arraysize 的默認(rèn)值為 1。

cx_Oracle.Cursor.fetchmany([rows_no])

獲取數(shù)據(jù)庫(kù)中接下來(lái)的 rows_no 行。如果該參數(shù)未指定,該方法獲取的行數(shù)是 arraysize 的數(shù)量。如果 rows_no

大于獲取到的行的數(shù)目,該方法獲取的行數(shù)是剩余的行數(shù)。

cx_Oracle.Cursor.fetchone()

從數(shù)據(jù)庫(kù)中獲取單個(gè)字節(jié)組,如果沒(méi)有剩余行,則返回 none。

在繼續(xù)了解游標(biāo)示例前,請(qǐng)先了解 pprint 模塊的 pprint 函數(shù)。它用于以清晰、可讀的形式輸出 Python

數(shù)據(jù)結(jié)構(gòu)。

>>>

from pprint import pprint

>>>

cursor.execute('SELECT feed_id, feed_url,

XMLType.GetClobVal(feed_xml) FROM rss_feeds')

>>>

cursor.execute('SELECT * FROM jobs')

[,

,

,

None>]

>>>

pprint(cursor.fetchall())

[('AD_PRES', 'President', 20000, 40000),

('AD_VP', 'Administration Vice President', 15000, 30000),

('AD_ASST', 'Administration Assistant', 3000, 6000),

('FI_MGR', 'Finance Manager', 8200, 16000),

('FI_ACCOUNT', 'Accountant', 4200, 9000),

?

('PR_REP', 'Public Relations Representative', 4500,

10500)]

cx_Oracle 游標(biāo)是迭代器。利用這些強(qiáng)大的 Python

結(jié)構(gòu),您可以一種自然的方式對(duì)序列進(jìn)行迭代,該方式僅根據(jù)需要獲取后續(xù)的項(xiàng)。高成本的數(shù)據(jù)庫(kù)選擇操作自然符合這一思路,因?yàn)閿?shù)據(jù)只在需要時(shí)才被獲取。您可以進(jìn)行迭代操作直至找到需要的值或滿足另一條件,而不必創(chuàng)建或獲取整個(gè)的結(jié)果集。

>>>

cursor = db.cursor()

>>>

cursor.execute('SELECT * FROM jobs')

[,

,

,

None>]

>>> for row in cursor:

## notice that this is plain English!

... print row

...

('AD_VP', 'Administration Vice President', 15000, 30000)

('AD_ASST', 'Administration Assistant', 3000, 6000)

('FI_MGR', 'Finance Manager', 8200, 16000)

('FI_ACCOUNT', 'Accountant', 4200, 9000)

('AC_MGR', 'Accounting Manager', 8200, 16000)

?

('PR_REP', 'Public Relations Representative', 4500,

10500)

執(zhí)行 list(cursor) 后,會(huì)針對(duì) cursor.fetchall() 執(zhí)行相同的任務(wù)。這是因?yàn)閮?nèi)置的 list()

函數(shù)會(huì)在給定的迭代器結(jié)束前一直進(jìn)行迭代。

數(shù)據(jù)類型

在獲取階段,基本的 Oracle 數(shù)據(jù)類型會(huì)映射到它們?cè)?Python 中的等同數(shù)據(jù)類型中。cx_Oracle

維護(hù)一個(gè)單獨(dú)的、有助于這一轉(zhuǎn)換的數(shù)據(jù)類型集合。Oracle - cx_Oracle - Python 映射為:

Oracle

cx_Oracle

Python

VARCHAR2

NVARCHAR2

LONG

cx_Oracle.STRING

str

CHAR

cx_Oracle.FIXED_CHAR

NUMBER

cx_Oracle.NUMBER

int

FLOAT

float

DATE

cx_Oracle.DATETIME

datetime.datetime

TIMESTAMP

cx_Oracle.TIMESTAMP

CLOB

cx_Oracle.CLOB

cx_Oracle.LOB

BLOB

cx_Oracle.BLOB

除涉及大型對(duì)象的情況外,上述數(shù)據(jù)類型對(duì)于用戶通常是透明的。截至版本 4.3,cx_Oracle

仍然自已處理這些數(shù)據(jù)類型,而沒(méi)有與內(nèi)置的文件類型打包到一起。

cx_Oracle 目前不負(fù)責(zé)處理的其他數(shù)據(jù)類型包括 XMLTYPE

和所有復(fù)雜的類型。目前所有對(duì)未支持類型的列的查詢都會(huì)失敗,同時(shí)引發(fā) NotSupportedError

異常。您需要從查詢中清除它們或?qū)⑺鼈冝D(zhuǎn)換為支持的數(shù)據(jù)類型。

例如,考慮下面用于存儲(chǔ)聚合的 RSS 信源提供的表:

CREATE TABLE rss_feeds

(

feed_id NUMBER PRIMARY KEY,

feed_url VARCHAR2(250) NOT NULL,

feed_xml XMLTYPE

);

嘗試使用 Python 查詢此表時(shí),需執(zhí)行一些額外的步驟。在下例中,XMLType.GetClobVal() 用于以 CLOB

值形式從表中返回 XML。

>>>

cursor.execute('SELECT * FROM rss_feeds')

Traceback (most recent call last):

File "", line 1, in

cursor.execute('SELECT * FROM rss_feeds')

NotSupportedError: Variable_TypeByOracleDataType: unhandled data

type 108

>>>

cursor.execute('SELECT feed_id, feed_url,

XMLType.GetClobVal(feed_xml) FROM rss_feeds')

[,

,

None>]

您可能已經(jīng)注意到了,cx_Oracle.Cursor.execute* 系列方法為查詢返回列數(shù)據(jù)類型。這些是變量對(duì)象列表(DB

API 2.0 的擴(kuò)展),它們?cè)讷@取階段之前獲取值

None,在獲取階段之后獲取合適的數(shù)據(jù)值。有關(guān)數(shù)據(jù)類型的詳細(xì)信息,可以通過(guò)游標(biāo)對(duì)象的 description

屬性獲得。description 是一個(gè)包含 7

項(xiàng)內(nèi)容的字節(jié)組,每個(gè)字節(jié)組包含列名、列類型、顯示大小、內(nèi)部大小、精度、小數(shù)位數(shù)以及是否存在空的可能。注意列信息僅可供 SQL

查詢語(yǔ)句訪問(wèn)。

>>>

column_data_types = cursor.execute('SELECT * FROM employees')

>>> print

column_data_types

[,

,

,

,

,

,

,

,

,

,

None>]

>>>

pprint(cursor.description)

[('EMPLOYEE_ID',

'cx_Oracle.NUMBER'>, 7, 22, 6, 0, 0),

('FIRST_NAME',

'cx_Oracle.STRING'>, 20, 20, 0, 0, 1),

('LAST_NAME',

'cx_Oracle.STRING'>, 25, 25, 0, 0, 0),

('EMAIL', ,

25, 25, 0, 0, 0),

('PHONE_NUMBER',

'cx_Oracle.STRING'>, 20, 20, 0, 0, 1),

('HIRE_DATE',

'datetime.datetime'>, 23, 7, 0, 0, 0),

('JOB_ID', ,

10, 10, 0, 0, 0),

('SALARY', ,

12, 22, 8, 2, 1),

('COMMISSION_PCT',

'cx_Oracle.NUMBER'>, 6, 22, 2, 2, 1),

('MANAGER_ID',

'cx_Oracle.NUMBER'>, 7, 22, 6, 0, 1),

('DEPARTMENT_ID',

'cx_Oracle.NUMBER'>, 5, 22, 4, 0,

1)]

綁定變量模式

正如 Oracle 大師 Tom Kyte 介紹的那樣,綁定變量是數(shù)據(jù)庫(kù)開(kāi)發(fā)的核心原則。它們不僅使程序運(yùn)行更快,同時(shí)可以防范 SQL

注入攻擊。請(qǐng)看以下查詢:

SELECT * FROM

emp_details_view WHERE department_id=50

SELECT * FROM emp_details_view WHERE department_id=60

SELECT * FROM emp_details_view WHERE department_id=90

SELECT * FROM emp_details_view WHERE department_id=110

逐個(gè)運(yùn)行時(shí),它們需要分別進(jìn)行分析,這為您的應(yīng)用程序增加了額外的開(kāi)銷。通過(guò)使用綁定變量,您可以告訴 Oracle

對(duì)一個(gè)查詢只分析一次。cx_Oracle 支持按名稱或位置綁定變量。

按名稱傳遞綁定變量要求執(zhí)行方法的 parameters 參數(shù)是一個(gè)字典或一組關(guān)鍵字參數(shù)。下面的 query1 和 query2

是等同的:

>>> named_params =

{'dept_id':50, 'sal':1000}

>>> query1 =

cursor.execute('SELECT * FROM employees WHERE

department_id=:dept_id AND salary>:sal',

named_params)

>>> query2 =

cursor.execute('SELECT * FROM employees WHERE

department_id=:dept_id AND salary>:sal', dept_id=50,

sal=1000)

在使用已命名的綁定變量時(shí),您可以使用游標(biāo)的 bindnames() 方法檢查目前已指定的綁定變量:

>>> print

cursor.bindnames()

['DEPT_ID', 'SAL']

按位置傳遞與此相似,但是您需要謹(jǐn)慎命名。變量名是任意的,因此這種方式很容易使查詢混亂。在下例中,三個(gè)查詢 r1、r2 和 r3

都是等同的。parameters 變量必須作為序列提供。

>>> r1 =

cursor.execute('SELECT * FROM locations WHERE country_id=:1 AND

city=:2', ('US', 'Seattle'))

>>> r2 =

cursor.execute('SELECT * FROM locations WHERE country_id=:9 AND

city=:4', ('US', 'Seattle'))

>>> r3 =

cursor.execute('SELECT * FROM locations WHERE country_id=:m AND

city=:0', ('US', 'Seattle'))

在綁定時(shí),您可以首先準(zhǔn)備該語(yǔ)句,然后利用改變的參數(shù)執(zhí)行 None。根據(jù)綁定變量時(shí)準(zhǔn)備一個(gè)語(yǔ)句即足夠這一原則,Oracle

將如同在上例中一樣對(duì)其進(jìn)行處理。準(zhǔn)備好的語(yǔ)句可執(zhí)行任意次。

>>>

cursor.prepare('SELECT * FROM jobs WHERE

min_salary>:min')

>>> r =

cursor.execute(None, {'min':1000})

>>> print

len(cursor.fetchall())

19

您已經(jīng)限制了分析次數(shù)。在下一段中,我們將消除不必要的執(zhí)行,尤其是成本高昂的批量插入。

一次多行

大型的插入操作不需求多次的單獨(dú)插入,這是因?yàn)?Python 通過(guò) cx_Oracle.Cursor.executemany

方法完全支持一次插入多行。限制執(zhí)行操作的數(shù)量極大地改善了程序性能,因此在編寫(xiě)存在大量插入操作的應(yīng)用程序時(shí)應(yīng)首先考慮這一功能。

我們首先為 Python 模塊列表創(chuàng)建一個(gè)表,這次直接從 Python 開(kāi)始。您將在以后刪除該表。

>>>

create_table = """

CREATE TABLE python_modules (

module_name VARCHAR2(50) NOT NULL,

file_path VARCHAR2(300) NOT NULL

)

"""

>>> from sys import

modules

>>>

cursor.execute(create_table)

>>> M = []

>>> for m_name, m_info

in modules.items():

... try:

... M.append((m_name, m_info.__file__))

... except AttributeError:

... pass

...

>>> len(M)

76

>>>

cursor.prepare("INSERT INTO python_modules(module_name, file_path)

VALUES (:1, :2)")

>>>

cursor.executemany(None, M)

>>> db.commit()

>>> r =

cursor.execute("SELECT COUNT(*) FROM python_modules")

>>> print

cursor.fetchone()

(76,)

>>>

cursor.execute("DROP TABLE python_modules PURGE")

僅向數(shù)據(jù)庫(kù)發(fā)出一個(gè)執(zhí)行操作,要求將 76

個(gè)模塊名稱全部插入。這對(duì)大型插入操作而言是一個(gè)巨大的性能提升。注意此處的兩點(diǎn)小的不同:cursor.execute(create_tab)

不產(chǎn)生任何輸出,這是因?yàn)樗且粋€(gè) DDL 語(yǔ)句,而 (76,) 是一個(gè)有單個(gè)元素的字節(jié)組。不含逗號(hào)的 (76) 完全等同于整數(shù)

76。

總結(jié)

熟悉 Oracle-Python 連接性的基本概念之后,您就可以開(kāi)始編寫(xiě)自己的數(shù)據(jù)庫(kù)驅(qū)動(dòng)的應(yīng)用程序了。我強(qiáng)烈建議花一些時(shí)間來(lái)使用

Python 交互式 shell,因?yàn)樗_實(shí)會(huì)使學(xué)習(xí)過(guò)程更加容易。

您了解了 SQL 語(yǔ)句經(jīng)歷的三個(gè)階段,也了解了如何將 Oracle

數(shù)據(jù)庫(kù)需要執(zhí)行的步驟減至最少。綁定變量是數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)不可避免的一部分,Python 支持按名稱或位置進(jìn)行綁定。

您還了解了 Oracle 和 Python

數(shù)據(jù)類型間的平滑轉(zhuǎn)換,以及在將游標(biāo)作為迭代器進(jìn)行處理的上下文中數(shù)據(jù)庫(kù)數(shù)據(jù)的自然處理方式。所有這些特性都促進(jìn)了生產(chǎn)效率的提高并支持專注于數(shù)據(jù),而這正是核心所在。

Przemyslaw Piotrowski

是一名信息技術(shù)專家,專門研究新興技術(shù)和動(dòng)態(tài)、靈活的開(kāi)發(fā)環(huán)境。他擁有很強(qiáng)的 IT

專業(yè)技術(shù)背景(包括管理、開(kāi)發(fā)和設(shè)計(jì)),并發(fā)現(xiàn)了許多軟件互操作方法。

總結(jié)

以上是生活随笔為你收集整理的python查询最高分_精通 Oracle+Python,第 1 部分:查询最佳应践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色aaa毛片 | 久久人人妻人人人人妻性色av | 国产麻豆久久 | 好吊操这里只有精品 | 8x8ⅹ国产精品一区二区二区 | 日本少妇全体裸体洗澡 | 丰满熟妇人妻中文字幕 | 欧美色图11p| 午夜精品久久久久久久久久蜜桃 | 一区二区三区中文字幕在线观看 | 丝袜中文字幕 | 夜夜嗨影院 | 人妻激情偷乱视频一区二区三区 | 91在线不卡| 91精品啪在线观看国产 | youjizz国产精品 | 国产99在线观看 | 人妻无码久久一区二区三区免费 | 国产激情一区二区三区视频免樱桃 | 麻豆传媒视频入口 | 无码少妇一级AV片在线观看 | 少妇被爽到高潮动态图 | 污网站免费在线观看 | 国产免费999 | 国产老女人乱淫免费 | 欧美日韩成人精品 | www.youjizz.com在线观看 | 麻豆系列在线观看 | 不卡在线一区 | 78日本xxxxxxxxx59 亚洲图片小说视频 | 亚洲av无码精品色午夜果冻不卡 | 永久免费看黄网站 | 国产成人精品一区二区无码呦 | 女人的洗澡毛片毛多 | 国产女人18水真多毛片18精品 | 在线观看日韩一区二区 | 久久婷五月 | 免费a级片在线观看 | 少妇人妻一区二区三区 | 自拍偷拍导航 | 色就是色网站 | 丁香花电影免费播放电影 | 国产精品偷伦视频免费观看了 | 大尺度在线观看 | 欧美成人aaaa | 亚洲av无码国产精品久久久久 | 婷婷亚洲视频 | 亚洲欧美偷拍视频 | 99成人精品| 插综合| 亚洲成人第一页 | 在线免费播放 | 亚洲国产欧洲 | 久久久久在线观看 | 性综合网| 伊人最新网址 | 中文字幕1区 | 欧美日韩色视频 | 国产香蕉在线视频 | 中文字幕第80页 | 成人影| 第一色网站 | 99国产精品久久久久久久久久久 | 麻豆91视频 | 日韩av专区| 久久电影一区 | 校园春色亚洲 | 欧美一级α片 | 99视频在线精品免费观看2 | 肉肉av福利一精品导航 | 亚洲欧美日韩精品在线 | 黄色裸体网站 | 少妇人妻偷人精品无码视频新浪 | 欧美亚韩一区二区三区 | 欧美亚洲综合网 | 一区二区免费在线观看视频 | 日日干日日操 | 久久不卡免费视频 | 成人在线一区二区 | 国产精品一区二区av日韩在线 | caoporn免费在线 | 亚洲国产无码精品 | 97精品人妻一区二区三区蜜桃 | 狠狠干2018 | 亚洲成av人片在线观看无 | 钻石午夜影院 | 搞黄视频在线观看 | 欧美国产精品一区二区三区 | 五月婷婷六月婷婷 | 婷婷久久亚洲 | 国产免费毛卡片 | 玖玖玖国产精品 | 成人黄页网站 | 男插女在线观看 | 欧美a视频在线观看 | 中文字幕在线视频免费观看 | 91精品国产成人www | 妺妺窝人体色777777 | 中文精品久久久久人妻不卡 |