我有以下代码在Oracle db中执行sql问题:
try:
    conn = cx_Oracle.connect(DB_LOGIN+"/"+DB_PWD+"@"+SID)
    cursor = connection.cursor()
    cursor.execute(sql)
    connection.commit()
    cursor.close()
    conn.close()
except cx_Oracle.DatabaseError, ex:
    error, = ex.args
    print 'Error.code =', error.code
    print 'Error.message =' , error.message
    print 'Error.offset =', error.offset
    conn.rollback()
我收到了错误:DatabaseError: <cx_Orac...40066758>.
为什么我在控制台中看不到完整的错误消息?看起来异常部分未执行.我在linux上使用python 2.5和oracle 10.2.0.
更新:经过一番调查,我发现错误是DatabaseError: ORA-00911: invalid character.
我的sql字符串如下:sql = "SELECT ID FROM TABLE WHERE DESC  = '" + str(desc[0]) + "';".这是生成的字符串:"SELECT ID FROM TABLE WHERE DESC  = '3312';"
当我在SQL Developer中执行相同的请求时,它可以工作.那么我做错了什么?
默认情况下,cx_Oracle将每一行作为元组返回.
>>> import cx_Oracle
>>> conn=cx_Oracle.connect('scott/tiger')
>>> curs=conn.cursor()
>>> curs.execute("select * from foo");
>>> curs.fetchone()
(33, 'blue')
如何将每行作为字典返回?
有没有办法在python中使用cx_oracle执行sql脚本文件.
我需要在sql文件中执行我的create table脚本.
cx_Oracle包含__enter__和__exit__Connection对象上,而不是在游标对象.因此,我到处使用它来包装游标:
class CursorWrapper(object):
    def __init__(self, connection):
        self.connection = connection
        self.cursor = None
    def __enter__(self):
        self.cursor = self.connection.cursor()
        return self.cursor
    def __exit__(self, exc_type, exc_value, traceback):
       self.cursor.close()
然后,当我想要一个光标
with CursorWrapper(cnx) as cursor:
    cursor.execute("whatever sql statement")
它非常适合我的需求.
但是,我当时想知道什么可以阻止__enter__和__exit__方法直接添加到cx_Oracle中?
或者是否有更好的方法将游标与上下文管理一起使用,这可以解释为什么它没有在模块中定义?
编辑:对不起,我刚刚找到答案.我可以使用contextlib.closing.
import contextlib
with contextlib.closing(cnx.cursor()) as cursor:
我已经为Windows 64位安装了Anaconda 3.5,我需要使用软件包"cx_Oracle"连接到Oracle数据库.
我尝试使用anaconda方式:
conda install -c https://conda.anaconda.org/anaconda cx_oracle
以下错误消息:
Hint: the following packages conflict with each other:
  - cx_oracle
  - python 3.5*
Use 'conda info cx_oracle' etc. to see the dependencies for each package.
Note that the following features are enabled:
  - vc14
似乎cx_oracle与Python 3.5不兼容.
在此之后,我还尝试直接使用二进制文件安装:
python setup.py install
它抛出了一堆错误,如:
cx_Oracle.obj : error LNK2001: unresolved external symbol OCILobGetChunkSize
cx_Oracle.obj : error LNK2001: unresolved external symbol OCIStmtExecute
cx_Oracle.obj : error LNK2001: unresolved external symbol OCILobFileClose
有没有办法为Anaconda 3.5安装cx_oracle?
我在使用Python 3.5.2(Anaconda 4.1.1)的Windows 10 Pro 64位周年纪念版上.我下载了最新的Oracle 12c的即时客户端instantclient-basic-windows.x64-12.1.0.2.0.zip并instantclient-sdk-windows.x64-12.1.0.2.0.zip进入C:\instantclient,把C:\instantclient我的PATH.然后我cx_Oracle-5.2.1-12c.win-amd64-py3.5.exe 直接PyPI下载安装程序.
现在我可以启动一个Anaconda python提示并键入import cx_Oracle并成功.
>>> import cx_Oracle
>>>
当我在Eclipse Neon(4.6)上进入PyDev安装时,import cx_Oracle源文件中的行仍然显示错误为未解析的导入.
C:\bin\anaconda3\python.exe)并将其添加回来.我重新启动了Eclipse,但没有运气.import cx_Oracle为未解决的导入.如何PyDev查看我的cx_Oracle软件包安装?
请注意,有很多假设的答案对我不起作用; 如上所述,我已经尝试了所有建议.
我正在使用包含大量中文字符的数据库.我的代码是这样的:
connection = cx_Oracle.connect("%s/%s@%s:%s/%s" % (username, password, host, port, service_name))
cursor = connection.cursor()
cursor.execute('SELECT HOTEL_ID,CREATE_TIME,SOURCE,CONTENT,TITLE,RATE,UPDATE_TIME FROM T_FX_COMMENTS')
for row in cursor:
    # Stuff goes here
    pass
但我得到这个错误:
Traceback (most recent call last):
  File "test.py", line 17, in <module>
    for row in cursor:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 26: illegal multibyte sequence
这似乎GBK还不够.我想让cx-oracle我给出GB18030编码结果,而不是GBK.我该怎么做呢?
cx_Oracle.Connection.encoding是只读的...我没有在cx-oracle文档中找到任何暗示我可以做到这一点的内容.
我使用的是Python 3.3.2和cx-oracle5.1.2.我必须在这里找到一些东西.感谢帮助!
我正在尝试将Pandas DataFrame导出到Oracle数据库.我在Pandas中遇到过Write_Frame函数,听起来就像我需要的那样.
但是,我在网上进行了大量的搜索,但却无法让它发挥作用.我已经导入了cx_Oracle并且可以连接到Oracle数据库以及运行SQL查询而没有任何问题,但是当我运行它时它给了我一个' NotImplementedError ':
import pandas.io.sql as psql
 output = psql.write_frame(MyResults, name = 'MySchema.MyTable', con = MyCon, 
                           flavor = 'oracle', if_exists = 'replace')
到目前为止,我已经在sqlite和mysql上看到了很多关于wrtie_frame的例子,那么这是否意味着如果flavor ='oracle'它将不起作用?我已经尝试将味道改为mysql,但它给我一个错误,说"无效的SQL语句"?
任何人都可以帮我解决这个问题,因为我不想将结果写入CSV文件然后导出到数据库表吗?
谢谢
我在django中有一个模型对象,就像这样......
from django.db import models
class Person(models.Model):
     employee_title = models.CharField(max_length=150)
     pk_person_id = models.IntegerField(primary_key=True)
     department_name = models.CharField(max_length=240)
     cost_center = models.CharField(max_length=150)
     user_name = models.CharField(max_length=100)
def __str__(self):
    return self.user_name
class Meta:
    managed = False
    db_table = 'company_hr_idm_data_v'
在我看来,我正在做一个像对象一样简单的get对象...
testobj = Person.objects.using('oracle').get(pk=4)
代码错误的DatabaseError说法
ORA-01861:文字与格式字符串不匹配
这是我在settings.py中将调试模式设置为true时的堆栈跟踪I代码
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/roles/testing
Django Version: 1.7.2
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'roles')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/Users/adjeibad/.virtualenvs/wwtmlserver/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111. …我正在使用cx_Oracle模块在Python中进行一些数据库基准测试.为了对结果进行基准测试,我运行了150个独特的查询并计算每个查询的执行时间.我正在运行这样的事情:
c = connection.cursor()
starttime = time.time()
c.execute('SELECT /*+ NOCACHE */ COUNT (*) AS ROWCOUNT FROM (' + sql + ')')
endtime = time.time()
runtime = endtime - starttime
每个查询都通过变量传递sql,并且它们在长度,运行时和它们访问的表方面有很大差异.话虽如此,所有查询都表现出以下行为:
第一轮:很慢(相对)
第二轮:明显更快(需要1/2到1/5的时间)
第三轮:比第二轮快一点
所有后续运行> = 4:大约等于第3次运行
我需要禁用缓存来获得准确的结果,但前几次运行实际上是在抛弃我的数据; 这好像NOCACHE根本不起作用......这里发生了什么?
编辑:艾伦回答了我的问题,但是对于任何可能感兴趣的人,我做了一些研究并发现了这两个页面也很有用: