Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2011-07-01

cx_Oracle & LOB

Странные дела, при гуглении вопроса «как засунуть Python-ом данные в Oracle-евый CLOB?» вылезает целая куча встречных вопросов. Типа «я не могу... как мне...». При том, что в установочном пакете cx_Oracle есть примеры и тесты записи и чтения LOB-ов. Я по ним за 15 минут сделал рабочий пример, без шуму и пыли.

USERNAME = 'MKV'
PASSWORD = '1234'
TNSENTRY = 'tb12'
ARRAY_SIZE = 50
class VoraDriver:
 def __init__(self):
  self.connection = ''
  self.cursor = ''
 def setUp(self):
  self.connection = cx_Oracle.connect(USERNAME, PASSWORD, TNSENTRY)
  self.cursor = self.connection.cursor()
  self.cursor.arraysize = ARRAY_SIZE
 def __del__(self):
  del self.cursor
  del self.connection
#class VoraDriver:

class VcsvReader:
 def __init__(self, fname='t.csv'):
  self.fname = fname
  self.fileObj = open(fname, 'rb')
  self.csvReader = csv.reader(self.fileObj, \
   delimiter=';', quotechar="'", quoting=csv.QUOTE_ALL, lineterminator='\n')
 def __del__(self):
  del self.csvReader
  self.fileObj.close()
 def readrow(self):
  try:
   return self.csvReader.next()
  except:
   return None
#class VcsvReader:

def insertRecord(row, ora):
 ora.cursor.setinputsizes(coords = cx_Oracle.CLOB)
 ora.cursor.execute("""
INSERT INTO MKV.BIGTAB (
  DWG, TYPENAME, TYPENUM, LYR, EID, HAND, XDATA, COORDS, ROTANG, TXT, CLOSTY, RAD)
values (:dwg, :typename, :typenum, :layer, :id, :handle, :xdata,
  :coords,
  :angle, :text, :closed, :radius
)""", dwg = row[0], typename = row[1], typenum = row[2], layer = row[3].decode('utf-8'), \
 id = row[4], handle = row[5],\
 xdata = row[6].decode('utf-8'), coords = row[7], angle = row[8], text = row[9].decode('utf-8'),\
 closed = row[10].decode('utf-8'), radius = row[11])
 #~ ora.connection.commit()
#def insertRecord(row, ora):

def doWork(inp):
 ora = VoraDriver()
 ora.setUp()
 rdr = VcsvReader(inp)
 csvRowNum = 0
 while True:
  row = rdr.readrow()
  csvRowNum += 1
  if row == None: break
  if csvRowNum < 3:
   t = map(lambda a: (sys.stdout.write('[%s], ' % a)), row)
   print
   continue
  insertRecord(row, ora)
...

Я не понял, народ, какие проблемы? За полчаса 100000 записей инсертнулось не жужжа. Самый большой CLOB был почти 33 килобайта.

А по сути, несмотря на всю крутоту Oracle, текстовую строку длиннее 4000 байт в текстовое поле не запихать. Приходится использовать LOB-ы. Что не так удобно, как хочется.


У меня тут было про блобы + MS SQL
 

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)