# Read

Jump to the [Code block](#code-block) for a combined complete example.

## Setup

The following examples use the setup and record below to illustrate single record data retrieval from an Aerospike database.

```python
import aerospike

# Define host configuration

config = {

    'hosts': [ ('127.0.0.1', 3000) ]

}

# Establishes a connection to the server

client = aerospike.client(config).connect()

# Creates a key with the namespace "sandbox", set "ufodata", and user key 5001

key = ('sandbox', 'ufodata', 5001)
```

The record structure:

```plaintext
+------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+

| PK   | occurred | reported | posted   | report                                                                                                                                                                                                                 | location                                                   |

+------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+

| 5001 | 20220531 | 20220601 | 20220601 | MAP('{"shape":["circle", "flash", "disc"], "summary":"Large flying disc flashed in the sky above the student union. Craziest thing I've ever seen!", "city":"Ann Arbor", "state":"Michigan", "duration":"5 minutes"}') | GeoJSON('{"type":"Point","coordinates":[42.2808,83.743]}') |

+------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+
```

## Policies

Instead of using the default read [policies](https://aerospike.com/docs/database/learn/policies), we can set them on a per command basis.

The following example creates a new read policy and sets the [socket timeout](https://aerospike.com/docs/database/learn/policies#socket-timeout) for the command.

```python
# Create new read policy

policy = {'socket_timeout': 300}
```

## Read a record

### Record exists

Checking record existence is faster than getting the record because it only needs to look at the primary index.

```python
# Returns key and metadata if exists, None if not

(key, meta) = client.exists(key, policy=policy)

# Do something

exists = True

if meta == None:

    exists = False

print('Exists: ', exists)

# Close the connection to the server

client.close()
```

### Record metadata only

Read record metadata (generation and expiration information) without reading the bins for a specified key.

```python
# Get record metadata

(key, meta) = client.exists(key, policy=policy)

# Do something

print('Record: ', meta)

# Close the connection to the server

client.close()
```

### Whole record

Read the record metadata and all bins for a specified key.

```python
# Get whole record

(key_, meta, bins) = client.get(key, policy=policy)

# Do something

print('Record: ', bins)

# Close the connection to the server

client.close()
```

### Specific bins

Read the record metadata and the `report` and `location` bins from the record.

```python
# Get bins 'report' and 'location'

(key_, meta, bins) = client.select(key, ("report", "location"), policy=policy)

# Do something

print('Record: ', bins)

# Close the connection to the server

client.close()
```

## Code block

Expand this section for a single code block to read a record

```python
import aerospike

# Define host configuration

config = {

    'hosts': [ ('127.0.0.1', 3000) ]

}

# Establishes a connection to the server

client = aerospike.client(config).connect()

# Creates a key with the namespace "sandbox", set "ufodata", and user key 5001

key = ('sandbox', 'ufodata', 5001)

# Create new read policy

policy = {'socket_timeout': 300}

# Get whole record

(key_, meta, bins) = client.get(key, policy=policy)

# Do something

print('Record: ', bins)

# Close the connection to the server

client.close()
```