Py学习  »  docker

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

Victor Ferreira • 4 年前 • 669 次点击  

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

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

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

有可能吗?

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

我不确定官方的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