Python 如何从Oracle访问DVC控制的文件?
我一直在Oracle中以CLOB存储我的大文件,但我正在考虑将我的大文件存储在共享驱动器中,然后在Oracle中设置一个列,其中包含指向这些文件的指针。这将使用DVC 当我这样做的时候 (a) Oracle路径中指向共享驱动器中文件的路径是否与实际文件本身相同 (b) 或者Oracle中的路径是否以某种方式指向DVC元文件 任何洞察都会帮助我的 谢谢:) 贾斯汀Python 如何从Oracle访问DVC控制的文件?,python,oracle,dvc,Python,Oracle,Dvc,我一直在Oracle中以CLOB存储我的大文件,但我正在考虑将我的大文件存储在共享驱动器中,然后在Oracle中设置一个列,其中包含指向这些文件的指针。这将使用DVC 当我这样做的时候 (a) Oracle路径中指向共享驱动器中文件的路径是否与实际文件本身相同 (b) 或者Oracle中的路径是否以某种方式指向DVC元文件 任何洞察都会帮助我的 谢谢:) 贾斯汀 编辑以提供更清晰的信息: 我检查了这里(),这很有帮助,但我还没有完全做到 我想使用python(我已经连接到Oracle数据库)从
编辑以提供更清晰的信息: 我检查了这里(),这很有帮助,但我还没有完全做到 我想使用python(我已经连接到Oracle数据库)从远程dvc存储库中提取一个文件。所以,如果我们能做到这一点,我想我会很好。但是,我很困惑。如果我在下面指定“remote”,那么当远程文件都被编码时,我如何命名该文件(例如,“activity.log”)
with dvc.api.open(
'activity.log',
repo='location/of/dvc/project',
remote='my-s3-bucket'
) as fd:
for line in fd:
match = re.search(r'user=(\w+)', line)
# ... Process users activity log
(注意:出于测试目的,我的“远程”DVC目录只是MacBook上的另一个文件夹。)
我觉得我错过了获取远程文件的一个关键概念
我希望这能增加更多的清晰度。任何关于远程文件访问的帮助都将不胜感激!:)
贾斯汀
编辑以了解“rev”参数: 在我提问之前,请先了解一些背景/我的设置: (a) 我的MacBook上有一个名为“基础”的回购协议。 (b) 我将包含501个文件(称为“surface_文件”)的目录复制到“basics”中,然后将其推送到一个名为“gss”的远程存储文件夹中。推送之后,“gss”包含220个哈希目录 我在这里使用的步骤如下:
> cd ~/Desktop/Work/basics
> git init
> dvc init
> dvc add ~/Desktop/Work/basics/surface_files
> git add .gitignore surface_files.dvc
> git commit -m "Add raw data"
> dvc remote add -d remote_storage ~/Desktop/Work/gss
> git commit .dvc/config -m "Configure remote storage"
> dvc push
> rm -rf ./.dvc/cache
> rm -rf ./surface_files
接下来,我运行了以下Python代码以获取一个名为surface\u 100141.dat
的surface文件,并使用dvc.api.get\u url()
获取相应的远程存储文件名。然后,我将这个远程存储文件以文件的原始名称(即surface_100141.dat
)复制到我的桌面上
完成这一切的代码如下所示,但首先,我的问题是——当我按如下所示运行代码时,没有问题;但是当我取消注释'rev='行时,它失败了。我不知道为什么会这样。我使用了git log
和cat.git/refs/heads/master
来确保得到了正确的哈希值。为什么会失败?这是我的问题
(充分披露,我的git知识还不太强。我正在努力,但这仍然是一项正在进行的工作!)
我不能100%确定我是否理解这个问题(最好在您试图用这个数据库解决的实际用例上进行一些扩展),但我可以分享一些想法 当我们谈论DVC时,我认为您需要指定一些东西来标识文件/目录:
data/data/xml
)。确认数据文件的版本需要提交(确切地说是任何Git版本)/mnt/shared/storage/00/198493ef2343ao
…)+此文件的实际名称。这样,您就可以保存
.dvc`文件中包含的信息使用dvc.api.open(
“activity.log”,
repo='location/of/dvc/project',
远程class='my-s3-bucket'
)作为fd:
对于fd中的行:
匹配=重新搜索(r'user=(\w+),行)
# ... 进程用户活动日志
location/of/dvc/project
此路径必须指向实际的Git回购。此repo应具有.dvc
或dvc.lock
文件,其中包含活动.log
名称+其在远程存储中的哈希:
out:
-md5:a304afb96060aad90176268345e10355
路径:activity.log
通过阅读此Git回购协议并进行分析,比如说activity.log.dvc
dvc将能够创建正确的路径s3://my bucket/storage/a3/04afb96060aad90176268345e10355
remote='my-s3-bucket'
参数是可选的。默认情况下,它将使用回购协议中定义的协议
让我们再举一个真实的例子:
使用dvc.api.open(
“get started/data.xml”,
回购协议https://github.com/iterative/dataset-registry'
)作为fd:
对于fd中的行:
匹配=重新搜索(r'user=(\w+),行)
# ... 进程用户活动日志
在https://github.com/iterative/dataset-registry
您可以通过分析文件的路径,找到足以让DVC创建文件路径的路径
您可以在此文件上运行
wget
来下载它文件通常存储在BLOB
列中,而不是CLOB
列中,除非文件是纯文本,如果客户端碰巧请求了与数据库不同的字符集,则不会受到字符集转换之类的影响。当您说您正在考虑存储指向文件的指针时,您是指BFILE
列(它只是对文件系统路径的引用)?或者您正在谈论一个VARCHAR2
列,其中存储了一个路径字符串?谢谢,@Shcheklein:)请参阅我上面的编辑,提供更多详细信息:)@Justin谢谢!我已经用一些细节更新了答案。如果仍然不清楚,请告诉我,您需要更多信息。再次感谢,@Shcheklein:)在玩了这个之后,我想我有了一些有用的东西——除了一个例外——我还没有成功使用dvc.api.get\u url()
的rev=
参数,所以我不知道如何指定正确的提交。如果可以的话,你能看看我最新编辑的原创文章吗?我已经展示了我的所有步骤,希望你能帮助我明白为什么我没有使用
import dvc.api
import os.path
from os import path
import shutil
filename = 'surface_100141.dat' # This file name would be stored in my Oracle database
home_dir = os.path.expanduser('~')+'/' # This simply expanding '~' into '/Users/ricej/'
resource_url = dvc.api.get_url(
path=f'surface_files/{filename}', # Works when 'surface_files.dvc' exists, even when 'surface_files' directory and .dvc/cache do not
repo=f'{home_dir}Desktop/Work/basics',
# rev='5c92710e68c045d75865fa24f1b56a0a486a8a45', # Commit hash, found using 'git log' or 'cat .git/refs/heads/master'
remote='remote_storage')
resource_url = home_dir+resource_url
print(f'Remote file: {resource_url}')
new_dir = f'{home_dir}Desktop/' # Will copy fetched file to desktop, for demonstration
new_file = new_dir+filename
print(f'Remote file copy: {new_file}')
if path.exists(new_file):
os.remove(new_file)
dest = shutil.copy(resource_url, new_file) # Check your desktop after this to see remote file copy
https://remote.dvc.org/dataset-registry/a3/04afb96060aad90176268345e10355