0

如果数据库不存在,我编写了一个小脚本来在 RethinkDB 中创建数据库和一些表。

我正在使用 Python shell 与 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

我怎样才能创建所有这些表一次而不是只创建第一个表?

4

1 回答 1

2

在您的第一个查询中,您将 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 构造作为 lambda 的主体是不合法的。它在 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))
于 2016-12-24T10:36:35.117 回答