我正在使用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登录.
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) 我开始使用VBA编辑器在Access 2010中创建自定义函数,但我一直收到预期的语句结束错误.
这是代码:
Public Function getPayTotal(ByVal StudentID As Long) As Long
Return StudentID
End Function
Run Code Online (Sandbox Code Playgroud)
我完全不知道为什么这不起作用.调试不断将我发送回Return StudentID行.我看起来非常简单吗?
谢谢.
我正在使用 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
我正在使用类和子类作为应用程序.对于每个类,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) 我一直在解决一个问题,但我不确定风格/功能明智,这通常被认为是最佳实践。
我有一个函数,可以对同一字符串进行多次检查,并根据该字符串返回一个值。使用堆叠式 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 ×5
python-3.x ×3
coding-style ×1
cx-oracle ×1
ms-access ×1
oracle ×1
pep8 ×1
sql ×1
sqlalchemy ×1
vba ×1