2017-01-09 2 views
0

Я тестирую API, который вставляет или удаляет данные в нескольких таблицах базы данных RethinkDB. Чтобы отслеживать, что происходит с базой данных при использовании API, я хотел бы напечатать изменения в всех таблиц.Как сгенерировать изменение RethinkDB для всех таблиц в базе данных

Вот некоторые «псевдо-код», что я пытаюсь достичь:

import rethinkdb as r 

# Prior to running this script, run "rethinkdb --port-offset 1" at the command line 
conn = r.connect('localhost', 28016) 
if 'test' in r.db_list().run(conn): 
    r.db_drop('test').run(conn) 
r.db_create('test').run(conn) 

r.table_create('table1').run(conn) 
r.table_create('table2').run(conn) 

feed = r.table('table1' and 'table2').changes().run(conn) 
for document in feed: 
    print document 

Перед запуском этого сценария, я бы запустить rethinkdb --port-offset 1 инициализировать базу данных RethinkDB.

После того, как этот скрипт работает, я хотел бы, чтобы вставить данные в любой table1 или table2 (с использованием, например, веб-интерфейс на localhost:8081) и видеть изменения, напечатанные в терминале запущен скрипт. Это, похоже, не работает, но , потому что r.table('table1' and 'table2'), вероятно, недействительный запрос ReQL.

Как контролировать изменения в обеих таблицах?

ответ

2

Вы можете следить за несколько changefeeds в одном запросе с помощью r.union:

r.union(
    r.table('table1').changes(), 
    r.table('table2').changes() 
).run(conn) 
1

я в конечном итоге работает на changefeeds для каждой таблицы в отдельном потоке:

import rethinkdb as r 
import threading 

# Prior to running this script, run "rethinkdb --port-offset 1" at the command line 
conn = r.connect('localhost', 28016) 

def clear_test_database(): 
    '''Clear the contents of the "test" database by dropping and re-creating it.''' 
    if 'test' in r.db_list().run(conn): 
     r.db_drop('test').run(conn) 
    r.db_create('test').run(conn) 

clear_test_database() 

def monitor_changes(table_name, conn): 
    feed = r.table(table_name).changes().run(conn) 
    for document in feed: 
     print document 

tables = ['table1', 'table2'] 

for table in tables: 
    conn = r.connect('localhost', 28016) 
    r.table_create(table).run(conn) 
    thread = threading.Thread(target=monitor_changes, args=(table, conn)) 
    thread.start() 

Обратите внимание, что я повторно определить объект подключения conn в для цикла, поскольку эти объекты не являются поточно-безопасными.

Для проверки методы, я открыл веб-интерфейс на localhost:8081 и использовал следующую insert команды:

enter image description here

В Sublime бегуна я вижу изменения, которые добавляются каждый раз, когда я нажмите «Выполнить» кнопка:

enter image description here

Это работает как когда я выбираю table1 или table2 в insert команда.

Смежные вопросы