小编use*_*245的帖子

SqlAlchemy反映Oracle表没有

我正在使用SQLAlchemy对Oracle数据库运行SQL查询.我有读取数据库的权限,但我拥有的用户并不拥有我正在使用的任何表.

数据库定期更新,因此我希望使用反射,而不是明确列出MetaData.我发现了这个问题,它描述了一个类似于我所拥有的问题.但是,我没有办法改变表的所有权,也没有办法以任何方式修改数据库.我只是有读取权限.

如果我没有这些表的所有权,有没有办法在SQLAlchemy中反映Oracle表?

(编辑)

示例代码:

engine = create_engine('ORACLE CONNECTION STRING')

metadata = MetaData()

students = Table('students', metadata, autoload=True, autoload_with=engine)
Run Code Online (Sandbox Code Playgroud)

我收到一个例外 sqlalchemy.exc.NoSuchTableError: students

但是,当我运行以下内容时:

results = engine.execute('SELECT * FROM students')

for r in results:
    print(r)
Run Code Online (Sandbox Code Playgroud)

我从表中收到了我期望的输出,这是每行所有字段的元组.

因此,我试图反映所有这些,而不是试图反映一个表:

metadata.reflect(bind=engine)

print(metadata.tables)
Run Code Online (Sandbox Code Playgroud)

输出是immutabledict({}).

所以基本上没什么.所有这些表都由用户A拥有,因为我以只读用户B登录.

python sql oracle sqlalchemy

6
推荐指数
1
解决办法
1252
查看次数

使用Python设置cx_Oracle环境变量

cx_Oracle for Python需要设置某些环境变量才能正确导入和工作。我没有尝试将我的应用程序包装在过去的bash脚本中,而是尝试仅使用Python设置变量。

以下是到目前为止我所拥有的。

# Check if OS environment variables are setup.
if 'ORACLE_HOME' not in os.environ.keys():
    os.environ['ORACLE_HOME'] = '/usr/lib/oracle/12.1/client64'
if 'LD_LIBRARY_PATH' not in os.environ.keys():
    os.environ['LD_LIBRARY_PATH'] = os.environ['ORACLE_HOME'] + '/lib'
if '/usr/lib/oracle' not in os.environ['PATH']:
    os.environ['PATH'] = os.environ['ORACLE_HOME'] + '/bin:' + os.environ['PATH']

import cx_Oracle
Run Code Online (Sandbox Code Playgroud)

不幸的是,我仍然收到来自cx_Oracle的异常,这基本上意味着变量未正确设置。

我也尝试使用subprocess.Popen()subprocess.call()直接调用导出,但是我不确定它们是否不能正常工作,或者我不能正确理解这些功能。

设置这些变量的最佳方法是什么,这样我就可以仅使用Python 3导入cx_Oracle。

编辑,下面是我通常添加到bash包装器中的内容:

#!/bin/sh

# Initialize Environmental Variables for cx_Oracle
export ORACLE_HOME=/usr/lib/oracle/12.1/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH

(Python Script)
Run Code Online (Sandbox Code Playgroud)

python cx-oracle environment-variables python-3.x

5
推荐指数
1
解决办法
5432
查看次数

奇怪的VBA预期声明结束错误

我开始使用VBA编辑器在Access 2010中创建自定义函数,但我一直收到预期的语句结束错误.

这是代码:

Public Function getPayTotal(ByVal StudentID As Long) As Long

Return StudentID

End Function
Run Code Online (Sandbox Code Playgroud)

我完全不知道为什么这不起作用.调试不断将我发送回Return StudentID行.我看起来非常简单吗?

谢谢.

ms-access vba

4
推荐指数
1
解决办法
1万
查看次数

从装饰器导入 Python 模块

我正在使用 Python 3 开发一个应用程序,我正在做的是非常规的。

cx_Oracle 是一个难以设置的模块,对于我的应用程序来说是一个可选的依赖项。我想做的是将模块的导入包装在装饰器中,仅放置在使用它的函数上方。这将不必在我的模块顶部导入并允许它不被设置。

class Loader():
    def load_cx_oracle(func):
        def inner(*args, **kwargs):

            # Additional code before import.

            import cx_Oracle

            return func(*args, **kwargs)
        return inner

    @load_cx_oracle
    def function_using_cx_oracle(self):
        conn = cx_Oracle.connect()
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试上述操作时,我得到了 NameError: name 'cx_Oracle' is not defined

python python-import python-3.x python-decorators

4
推荐指数
2
解决办法
2816
查看次数

Python类名作为类变量

我正在使用类和子类作为应用程序.对于每个类,super和sub,都有一个名为的变量类label.我希望label超类的变量默认为类名.例如:

class Super():
    label = 'Super'

class Sub(Super):
    label = 'Sub'
Run Code Online (Sandbox Code Playgroud)

而不是手动为每个类输出变量,是否可以从超类中的类名派生变量并自动为子类填充?

class Super():
    label = # Code to get class name

class Sub(Super)
    pass
    # When inherited Sub.label == 'Sub'.
Run Code Online (Sandbox Code Playgroud)

原因是这将是默认行为.我也希望如果我能获得默认行为,我可以稍后通过指定备用行为来覆盖它label.

class SecondSub(Super):
    label = 'Pie'  # Override the default of SecondSub.label == 'SecondSub'
Run Code Online (Sandbox Code Playgroud)

我尝试过使用__name__,但这不起作用,只是给了我'__main__'.

我想label@classmethod方法中使用类变量.所以我希望能够在不必实际创建Super()或Sub()对象的情况下引用该值,如下所示:

class Super():
    label = # Magic

    @classmethod
    def do_something_with_label(cls):
        print(cls.label)
Run Code Online (Sandbox Code Playgroud)

python class-variables python-3.x

2
推荐指数
3
解决办法
1781
查看次数

对于 Python 来说,堆叠式 if-语句或 if-elif-else 风格更好吗?

我一直在解决一个问题,但我不确定风格/功能明智,这通常被认为是最佳实践。

我有一个函数,可以对同一字符串进行多次检查,并根据该字符串返回一个值。使用堆叠式 if 语句或 if-elif-else 语句是更好的样式或功能吗?

例子:

def f(s):
    if s == 'Hey':
        return 'Sup.'
    if s == "How's it going?"
        return 'Not bad.'
    return 'I have no idea what you said.'
Run Code Online (Sandbox Code Playgroud)

或者

def f(s):
    if s == 'Hey':
        return 'Sup.'
    elif s == "How's it going?"
        return 'Not bad.'
    else
        return 'I have no idea what you said.'
Run Code Online (Sandbox Code Playgroud)

python coding-style pep8

0
推荐指数
1
解决办法
1723
查看次数