Создать несколько таблиц одновременно на RethinkDB

Я написал небольшой скрипт для создания БД и некоторых таблиц внутри RethinkDB, если база данных не существует.

Я использую оболочку Python для связи с RethinkDB

import rethinkdb as r

r.connect('localhost', 28015).repl()

r.db_list().contains('atlas').do(lambda databaseExists:
    r.branch(
        databaseExists,
        { 'dbs_created': 0 },
        r.db_create('atlas'),
        r.db('atlas').table_create('Carts'),
        r.db('atlas').table_create('Checkouts'),
        r.db('atlas').table_create('Collections'),
        r.db('atlas').table_create('Contents'),
        r.db('atlas').table_create('Orders'),
        r.db('atlas').table_create('Products'),
        r.db('atlas').table_create('Users'),
        r.db('atlas').table('Users').filter({'email': '{admin@gmail.com}'}).update({'status': 'active', 'scope': ['admin']})
    )
).run()

exit()

Это хорошо работает и создает базу данных, если не существует, но создает только первую таблицу Carts и пропустить следующий запрос.

Я попробовал с этим вместо

r.expr(['Carts', 'Checkouts', 'Collections', 'Contents', 'Orders', 'Products', 'Users']).do(lambda tables:
    for table in tables:
        r.db('atlas').table_create(table)
),

Но я получаю неверную синтаксическую ошибку

File "<stdin>", line 10
    r.expr(['Carts', 'Checkouts', 'Collections', 'Contents', 'Orders', 'Products', 'Users']).do(for table in tables:
                                                                                                  ^
 SyntaxError: invalid syntax

Как я могу создать все эти таблицы один раз вместо только первой таблицы?

1 ответ

Решение

В первом запросе вы передаете 11 аргументов branch, Поведение

r.branch(A, B, C, D, E, F, G)

ведет себя как

if A:
  return B
elif C:
  return D
elif E:
  return F
else:
  return G

Во втором запросе вы используете for ... in ..., Эта конструкция Python не является допустимой как тело лямбды. Это также не работает внутри запросов ReQL.

Полезным способом объединения операций записи в одном запросе RethinkDB является использование for_each, Вот пример:

r.branch(
  r.db_list().contains('atlas'),
  { 'dbs_created': 0 },
  r.expr([
    r.db_create('atlas'),
    r.db('atlas').table_create('Carts'),
    r.db('atlas').table_create('Checkouts')
  ]).for_each(x => x))
Другие вопросы по тегам