Создать несколько таблиц одновременно на 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))