Orientdb driver for python that uses the binary protocol.
Pyorient works with orientdb version 1.7 and later.
Warning Some issues are experimented with record_create/record_upload and OrientDB < 2.0. These command are strongly discouraged with these versions
NOTICE Prior to version 1.4.9 there was a potential SQL injection vulnerability that now is fixed. (see details , details )
pip install pyorient
- Fork the project
- work on develop branch
- Make your changes
- Add tests for it. This is important so I don't break it in a future version unintentionally
- Send me a pull request (pull request to master will be rejected)
- ???
- PROFIT
- ensure you have
antandnoseinstalled properly - bootsrap orient by running
./ci/ci-start.shfrom project directory
it will download latest orient and make some change on config and database for the tests - run with
nosetests
Proper documentation will be available soon, for now you have to read the tests.
PyOrient is composed of two layers. At its foundation is the python wrapper around OrientDB's binary protocol. Built upon that - and OrientDB's own SQL language - is the Object-Graph Mapper (or OGM). The OGM layer is documented separately.
client=pyorient.OrientDB("localhost", 2424)
session_id=client.connect( "admin", "admin" )client.db_create( db_name, pyorient.DB_TYPE_GRAPH, pyorient.STORAGE_TYPE_MEMORY )client.db_exists( db_name, pyorient.STORAGE_TYPE_MEMORY )client.db_open( db_name, "admin", "admin" )client.db_close()client.db_list()client.db_size()client.db_count_records()cluster_id=client.command( "create class my_class extends V" )
client.command(
"insert into my_class ( 'accommodation', 'work', 'holiday' ) values( 'B&B', 'garage', 'mountain' )"
)Warning Some issues are experimented with record_create/record_upload and OrientDB < 2.0. These command are strongly discouraged with these versions
rec= { '@my_class': { 'accommodation': 'house', 'work': 'office', 'holiday': 'sea' } }
rec_position=client.record_create( cluster_id, rec )Warning Some issues are experimented with record_create/record_upload and OrientDB < 2.0. These command are strongly discouraged with these versions
rec3= { '@my_class': { 'accommodation': 'hotel', 'work': 'home', 'holiday': 'hills' } }
update_success=client.record_update( rec_position._rid, rec_position._rid, rec3, rec_position._version )client.record_load( rec_position._rid )def_my_callback(for_every_record):
print(for_every_record)
client.record_load( rec_position._rid, "*:-1", _my_callback )result=client.query("select from my_class", 10, '*:0')def_my_callback(for_every_record):
print(for_every_record)
result=client.query_async("select from my_class", 10, '*:0', _my_callback)client.record_delete( cluster_id, rec_position._rid )client.db_drop( db_name )new_cluster_id=client.data_cluster_add(
'my_cluster_1234567', pyorient.CLUSTER_TYPE_PHYSICAL
)client.db_reload()client.data_cluster_data_range( new_cluster_id )client.data_cluster_count( [ 1, 2, 3, 4, 11 ] )client.data_cluster_drop( new_cluster_id )client.shutdown( "root", "a_super_secret_password" )### use a clustercluster_id=3### execute real create to get some inforec= { 'accommodation': 'mountain hut', 'work': 'not!', 'holiday': 'lake' }
rec_position=client.record_create( cluster_id, rec )
tx=client.tx_commit()
tx.begin()
### create a new recordrec1= { 'accommodation': 'home', 'work': 'some work', 'holiday': 'surf' }
rec_position1=client.record_create( -1, rec1 )
### prepare for an updaterec2= { 'accommodation': 'hotel', 'work': 'office', 'holiday': 'mountain' }
update_record=client.record_update( cluster_id, rec_position._rid, rec2, rec_position._version )
tx.attach( rec_position1 )
tx.attach( rec_position1 )
tx.attach( update_record )
res=tx.commit()
assertres["#3:1"].holiday=='mountain'assertres["#3:2"].holiday=='surf'assertres["#3:3"].holiday=='surf'cmd= ("begin;""let a = create vertex set script = true;""let b = select from v limit 1;""let e = create edge from $a to $b;""commit retry 100;")
edge_result=self.client.batch(cmd)Since version 27 is introduced an extension to allow use a token based session. This functionality must be enabled on the server config.
- In the first negotiation the client can ask for a token based authentication using the
client.set_session_tokenmethod. - The server will reply with a token or with an empty string meaning that it not support token based session and is using an old style session.
- For each request, the client will send the token and eventually it will get a new one if token lifetime ends.
When using the token based authentication, the connections can be shared between users of the same server.
client=pyorient.OrientDB("localhost", 2424)
client.set_session_token( True ) # set true to enable the token basedauthenticationclient.db_open( "GratefulDeadConcerts", "admin", "admin" )
### store this token somewheresessionToken=client.get_session_token()
### destroy the old client, equals to another user/socket/ip ecc.delclient### create a new clientclient=pyorient.OrientDB("localhost", 2424)
### set the previous obtained token to re-attach to the old sessionclient.set_session_token( sessionToken )
### now the dbOpen is not needed to perform database operationsrecord=client.query( 'select from V where @rid = #9:1' )
### set the flag again to true if you want to renew the tokenclient.set_session_token( True ) # set trueclient.db_open( "GratefulDeadConcerts", "admin", "admin" )
new_sessionToken=client.get_session_token()
assertsessionToken!=new_sessionTokenThe GRAPH representation of animals and its food
importpyorientclient=pyorient.OrientDB("localhost", 2424) # host, port### open a connection (username and password)client.connect("admin", "admin")
### create a databaseclient.db_create("animals", pyorient.DB_TYPE_GRAPH, pyorient.STORAGE_TYPE_MEMORY)
### select to use that databaseclient.db_open("animals", "admin", "admin")
### Create the Vertex Animalclient.command("create class Animal extends V")
### Insert a new valueclient.command("insert into Animal set name = 'rat', specie = 'rodent'")
### query the valuesclient.query("select * from Animal")
[<OrientRecordat0x7f>..., ...]
### Create the vertex and insert the food valuesclient.command('create class Food extends V')
client.command("insert into Food set name = 'pea', color = 'green'")
### Create the edge for the Eat actionclient.command('create class Eat extends E')
### Lets the rat likes to eat peaeat_edges=client.command(
"create edge Eat from (""select from Animal where name = 'rat'"") to (""select from Food where name = 'pea'"")"
)
### Who eats the peas?pea_eaters=client.command("select expand( in( Eat )) from Food where name = 'pea'")
foranimalinpea_eaters:
print(animal.name, animal.specie)
'rat rodent'
...
### What each animal eats?animal_foods=client.command("select expand( out( Eat )) from Animal")
forfoodinanimal_foods:
animal=client.query(
"select name from ( select expand( in('Eat') ) from Food where name = 'pea' )"
)[0]
print(food.name, food.color, animal.name)
'pea green rat'Copyright (c) 2014 Niko Usai, Domenico Lupinetti. See LICENSE for details.