社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

如何用导出的表和行创建dynamodb本地docker实例?

Victor Ferreira • 5 年前 • 1477 次点击  

我的aws帐户中有一个真正的dynamodb实例,它已经填充了表和行。

我需要创建一个运行dynamodb local的测试场景,所以我使用docker来实现这个目的。

我导出了一张表,里面有几行我真正的dynamodb。我想要实现的是运行DOCKER实例,传递一个.CSV文件或类似的东西,这样我的DyDoDB本地在启动时不会是空的。

有可能吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46458
 
1477 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Mostafa Hussein
Reply   •   1 楼
Mostafa Hussein    6 年前

我不确定官方的dynamodb本地是否默认支持这一点,而且看起来您需要一个将csv导入dynamodb的自定义脚本,但是您可以根据需要创建一个自定义图像。例如,你可以从一个简单的 Dockerfile 使用 amazon/dynamodb-local 然后添加一个python脚本,该脚本将负责导入csv文件,因此步骤可能如下:

  • 在容器中装入csv,可能在容器内部 /docker-entrypoint-initdb.d
  • 创建一个entrypoint.sh脚本,将其用作容器的入口点,并检查其中是否有任何csv文件 /docker入口点initdb.d 以便将其传递给python脚本- 下面添加的代码 -它将加载到dynamodb中,例如如下所示(取自 mongodb's entrypoint )以下内容:
        for f in /docker-entrypoint-initdb.d/*; do
            case "$f" in
                # if csv file pass it to the python script
                *.csv) echo "$0: running $f"; . "$f" ;;
                *)    echo "$0: ignoring $f" ;;
            esac
            echo
        done
  • 下面的代码不是我测试或创建的,我只是从下面的链接复制了它 Import a CSV file into a DynamoDB table using boto (Python package) ,您可以根据需要修改它,或者构建自己的脚本,或者如果您有更好的建议,请通知我以便更新答案。

  • boto支持dynamodb local,如下所述 answer 这意味着您可以修改脚本使其与dynamodb local一起工作

import boto

MY_ACCESS_KEY_ID = 'copy your access key ID here'
MY_SECRET_ACCESS_KEY = 'copy your secrete access key here'


def do_batch_write(items, table_name, dynamodb_table, dynamodb_conn):
    '''
    From https://gist.github.com/griggheo/2698152#file-gistfile1-py-L31
    '''
    batch_list = dynamodb_conn.new_batch_write_list()
    batch_list.add_batch(dynamodb_table, puts=items)
    while True:
        response = dynamodb_conn.batch_write_item(batch_list)
        unprocessed = response.get('UnprocessedItems', None)
        if not unprocessed:
            break
        batch_list = dynamodb_conn.new_batch_write_list()
        unprocessed_list = unprocessed[table_name]
        items = []
        for u in unprocessed_list:
            item_attr = u['PutRequest']['Item']
            item = dynamodb_table.new_item(
                    attrs=item_attr
            )
            items.append(item)
        batch_list.add_batch(dynamodb_table, puts=items)


def import_csv_to_dynamodb(table_name, csv_file_name, colunm_names, column_types):
    '''
    Import a CSV file to a DynamoDB table
    '''        
    dynamodb_conn = boto.connect_dynamodb(aws_access_key_id=MY_ACCESS_KEY_ID, aws_secret_access_key=MY_SECRET_ACCESS_KEY)
    dynamodb_table = dynamodb_conn.get_table(table_name)     
    BATCH_COUNT = 2 # 25 is the maximum batch size for Amazon DynamoDB

    items = []

    count = 0
    csv_file = open(csv_file_name, 'r')
    for cur_line in csv_file:
        count += 1
        cur_line = cur_line.strip().split(',')

        row = {}
        for colunm_number, colunm_name in enumerate(colunm_names):
            row[colunm_name] = column_types[colunm_number](cur_line[colunm_number])

        item = dynamodb_table.new_item(
                    attrs=row
            )           
        items.append(item)

        if count % BATCH_COUNT == 0:
            print 'batch write start ... ', 
            do_batch_write(items, table_name, dynamodb_table, dynamodb_conn)
            items = []
            print 'batch done! (row number: ' + str(count) + ')'

    # flush remaining items, if any
    if len(items) > 0: 
        do_batch_write(items, table_name, dynamodb_table, dynamodb_conn)


    csv_file.close() 


def main():
    '''
    Demonstration of the use of import_csv_to_dynamodb()
    We assume the existence of a table named `test_persons`, with
    - Last_name as primary hash key (type: string)
    - First_name as primary range key (type: string)
    '''
    colunm_names = 'Last_name First_name'.split()
    table_name = 'test_persons'
    csv_file_name = 'test.csv'
    column_types = [str, str]
    import_csv_to_dynamodb(table_name, csv_file_name, colunm_names, column_types)


if __name__ == "__main__":
    main()
    #cProfile.run('main()') # if you want to do some profiling

测试.CSV的内容(必须位于与Python脚本相同的文件夹中):

John,Doe
Bob,Smith
Alice,Lee
Foo,Bar
a,b
c,d
e,f
g,h
i,j
j,l