2017-12-09 2 views
1

Ich muss Auto_increment Funktion in Tarantool 1.6 mit Python-Client aufrufen.Tarantool in Python - wie Auto_increment Funktion

Ich habe ohne Erfolg versucht:

database = tarantool.connect("localhost", 3301) 
s = database.space("customer") 
s.call('auto_increment','foo') 

Könnte jemand klären, wie einen neuen Datensatz mit ‚foo‘ als Feld auto_increment in Python mit einfügen?

Ich schließe die Fehlermeldung ein, ich habe mehrere Möglichkeiten versucht, auto_increment in Python ohne Erfolg zu verwenden.

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/nameko/containers.py", line 388, in _run_worker 
    result = method(*worker_ctx.args, **worker_ctx.kwargs) 
    File "./service.py", line 25, in create 
    self.server.call('box.auto_increment', (0, 'foo')) 
    File "/usr/local/lib/python2.7/dist-packages/tarantool/connection.py", line 373, in call 
    response = self._send_request(request) 
    File "/usr/local/lib/python2.7/dist-packages/tarantool/connection.py", line 341, in _send_request 
    return self._send_request_wo_reconnect(request) 
    File "/usr/local/lib/python2.7/dist-packages/tarantool/connection.py", line 261, in _send_request_wo_reconnect 
    response = Response(self, self._read_response()) 
    File "/usr/local/lib/python2.7/dist-packages/tarantool/response.py", line 87, in __init__ 
    raise DatabaseError(self._return_code, self._return_message) 
DatabaseError: (48, 'Unknown request type 10') 
+0

s.call ('auto_increment', ('foo',)) funktioniert nicht –

Antwort

1

Zu allererst Sie tarantool 1.7+ statt 1.6 verwenden sollten. Abhängig von Ihrem System, sollten Sie entweder installieren neuere Version von Tarantool einen Paketmanager für Ihr Betriebssystem, oder verwenden Sie ein entsprechendes Docker Bild, das heißt:

$ docker run --rm -p 3301:3301 -t -i tarantool/tarantool:1.7 

Führen Sie den folgenden Code in tarantool Konsole:

box.cfg{ listen=3301 } 
customer = box.schema.space.create('customer', { 
    if_not_exists=true, 
    temporary=true 
}) 
customer:create_index('primary', {parts = {1, 'unsigned' }}) 
Jetzt

, führen python und führen Sie die folgenden Schritte aus:

$ python 
>> import tarantool 
>> server = tarantool.connect("localhost", 3301) 
>> space = server.space("customer") 
>> space.call("box.space.customer:auto_increment", [['alpha']]) 
- [1, 'alpha'] 
>> space.call("box.space.customer:auto_increment", [['bravo']]) 
- [2, 'bravo'] 

Beachten Sie die zwei dimesional Array in Argumente für space.call().

Seit der Version 1.7 auto_increment() ist veraltet und die richtige Art, Autoincrementierten Index zu haben, ist sequences zu verwenden.

Ihre tarantool Neustart und führen Sie den folgenden lua-Code in tarantool Konsole:

box.cfg{ listen=3301 } 

customer = box.schema.space.create('customer', { 
    if_not_exists=true, 
    temporary=true 
}) 

box.schema.sequence.create('S', { min=1 }) 

customer:create_index('primary', { 
    parts = {1, 'unsigned' }, 
    sequence = 'S' 
}) 

Nun führen Python und führen Sie die folgenden Schritte aus:

$ python 
>> import tarantool 
>> server = tarantool.connect("localhost", 3301) 
>> space = server.space("customer") 
>> space.insert((None, "alpha")) 
- [1, 'alpha'] 
>> space.insert((None, "bravo")) 
- [2, 'bravo'] 

Sie können here mehr über Sequenzen lesen.

0

Sie können auto_increment nur für einen Primärschlüssel verwenden. Es gibt keine Möglichkeit, ein anderes Feld in einem Tupel automatisch zu inkrementieren.

Siehe hier: https://tarantool.org/en/doc/1.6/book/box/box_space.html#box-space-auto-increment

+0

Ich erwarte automatisch nur den Primärschlüssel inkrementieren, dh das erste Feld des Tupels –

+0

Ich schrieb eine separate Antwort mit Code-Schnipsel zu erklären, wie Verwenden Sie "auto_increment()" (jetzt veraltet) und mehr "Sequenzen", damit Ihr Primärschlüssel automatisch erhöht wird. –