标签: cx-oracle

DatabaseError:ORA-00911:无效字符

我有以下代码在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()
Run Code Online (Sandbox Code Playgroud)

我收到了错误: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中执行相同的请求时,它可以工作.那么我做错了什么?

python oracle cx-oracle

9
推荐指数
1
解决办法
8185
查看次数

cx_Oracle:如何将每行作为字典接收?

默认情况下,cx_Oracle将每一行作为元组返回.

>>> import cx_Oracle
>>> conn=cx_Oracle.connect('scott/tiger')
>>> curs=conn.cursor()
>>> curs.execute("select * from foo");
>>> curs.fetchone()
(33, 'blue')
Run Code Online (Sandbox Code Playgroud)

如何将每行作为字典返回?

python sql oop oracle cx-oracle

9
推荐指数
2
解决办法
7223
查看次数

从cx_oracle执行sql脚本文件?

有没有办法在python中使用cx_oracle执行sql脚本文件.

我需要在sql文件中执行我的create table脚本.

python database cx-oracle

8
推荐指数
2
解决办法
2万
查看次数

在cx_Oracle中使用with cursor on cursor

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()
Run Code Online (Sandbox Code Playgroud)

然后,当我想要一个光标

with CursorWrapper(cnx) as cursor:
    cursor.execute("whatever sql statement")
Run Code Online (Sandbox Code Playgroud)

它非常适合我的需求.

但是,我当时想知道什么可以阻止__enter____exit__方法直接添加到cx_Oracle中?

或者是否有更好的方法将游标与上下文管理一起使用,这可以解释为什么它没有在模块中定义?

编辑:对不起,我刚刚找到答案.我可以使用contextlib.closing.

import contextlib
with contextlib.closing(cnx.cursor()) as cursor:
Run Code Online (Sandbox Code Playgroud)

python cx-oracle with-statement

8
推荐指数
1
解决办法
899
查看次数

Anaconda 3.5(64位Windows)安装cx_Oracle

我已经为Windows 64位安装了Anaconda 3.5,我需要使用软件包"cx_Oracle"连接到Oracle数据库.

我尝试使用anaconda方式:

conda install -c https://conda.anaconda.org/anaconda cx_oracle
Run Code Online (Sandbox Code Playgroud)

以下错误消息:

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
Run Code Online (Sandbox Code Playgroud)

似乎cx_oracle与Python 3.5不兼容.

在此之后,我还尝试直接使用二进制文件安装:

python setup.py install
Run Code Online (Sandbox Code Playgroud)

它抛出了一堆错误,如:

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
Run Code Online (Sandbox Code Playgroud)

有没有办法为Anaconda 3.5安装cx_oracle?

python oracle cx-oracle anaconda

8
推荐指数
1
解决办法
6618
查看次数

识别PyDev中的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.zipinstantclient-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
>>>
Run Code Online (Sandbox Code Playgroud)

当我在Eclipse Neon(4.6)上进入PyDev安装时,import cx_Oracle源文件中的行仍然显示错误为未解析的导入.

  • 我进入了Windows> Preferences> PyDev> Interpreters> Python Interpreter并删除了Anaconda解释器(C:\bin\anaconda3\python.exe)并将其添加回来.我重新启动了Eclipse,但没有运气.
  • 我在所有项目上发布了Project> Clean并重新启动了Eclipse.它仍显示import cx_Oracle为未解决的导入.

如何PyDev查看我的cx_Oracle软件包安装?

请注意,有很多假设的答案对我不起作用; 如上所述,我已经尝试了所有建议.

python windows cx-oracle pydev anaconda

8
推荐指数
1
解决办法
2194
查看次数

使用中文字符在cx_Oracle/UnicodeDecodeError中设置查询结果编码

我正在使用包含大量中文字符数据库.我的代码是这样的:

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
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

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
Run Code Online (Sandbox Code Playgroud)

这似乎GBK还不够.我想让cx-oracle我给出GB18030编码结果,而不是GBK.我该怎么做呢?

cx_Oracle.Connection.encoding是只读的...我没有在cx-oracle文档中找到任何暗示我可以做到这一点的内容.

我使用的是Python 3.3.2和cx-oracle5.1.2.我必须在这里找到一些东西.感谢帮助!

python encoding cx-oracle

7
推荐指数
2
解决办法
5019
查看次数

如何使用Pandas Write_Frame将结果导出到cx_Oracle中的Oracle数据库

我正在尝试将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')
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经在sqlite和mysql上看到了很多关于wrtie_frame的例子,那么这是否意味着如果flavor ='oracle'它将不起作用?我已经尝试将味道改为mysql,但它给我一个错误,说"无效的SQL语句"

任何人都可以帮我解决这个问题,因为我不想将结果写入CSV文件然后导出到数据库表吗?

谢谢

python sql oracle cx-oracle pandas

7
推荐指数
1
解决办法
4449
查看次数

ORA-01861:在django中执行get model对象时,literal与格式字符串不匹配

我在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'
Run Code Online (Sandbox Code Playgroud)

在我看来,我正在做一个像对象一样简单的get对象...

testobj = Person.objects.using('oracle').get(pk=4)
Run Code Online (Sandbox Code Playgroud)

代码错误的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. …
Run Code Online (Sandbox Code Playgroud)

python oracle django cx-oracle

7
推荐指数
1
解决办法
443
查看次数

Oracle 11g - 即使使用NOCACHE提示,查询也会缓存

我正在使用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
Run Code Online (Sandbox Code Playgroud)

每个查询都通过变量传递sql,并且它们在长度,运行时和它们访问的表方面有很大差异.话虽如此,所有查询都表现出以下行为:

第一轮:很慢(相对)

第二轮:明显更快(需要1/2到1/5的时间)

第三轮:比第二轮快一点

所有后续运行> = 4:大约等于第3次运行

我需要禁用缓存来获得准确的结果,但前几次运行实际上是在抛弃我的数据; 这好像NOCACHE根本不起作用......这里发生了什么?

编辑:艾伦回答了我的问题,但是对于任何可能感兴趣的人,我做了一些研究并发现了这两个页面也很有用:

如何清除Oracle中的所有缓存项

http://www.dba-oracle.com/t_flush_buffer_cache.htm

python oracle cx-oracle oracle11g

7
推荐指数
1
解决办法
4098
查看次数