mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-08-22 16:08:13 +00:00
Add tag docs (#10221)
This commit is contained in:
parent
f16e9dcc9f
commit
e67fe3a90b
@ -1121,6 +1121,8 @@ site_menu:
|
|||||||
url: /sdk/python/ingestion/dbt
|
url: /sdk/python/ingestion/dbt
|
||||||
- category: SDK / Python SDK / Ingestion / Lineage
|
- category: SDK / Python SDK / Ingestion / Lineage
|
||||||
url: /sdk/python/ingestion/lineage
|
url: /sdk/python/ingestion/lineage
|
||||||
|
- category: SDK / Python SDK / Ingestion / Tags
|
||||||
|
url: /sdk/python/ingestion/tags
|
||||||
- category: SDK / Python SDK / Build a Connector
|
- category: SDK / Python SDK / Build a Connector
|
||||||
url: /sdk/python/build-connector
|
url: /sdk/python/build-connector
|
||||||
- category: SDK / Python SDK / Build a Connector / Source
|
- category: SDK / Python SDK / Build a Connector / Source
|
||||||
|
@ -43,9 +43,18 @@ All functions that we are going to use related to Lineage can be found in [here]
|
|||||||
from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import (
|
from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import (
|
||||||
OpenMetadataConnection,
|
OpenMetadataConnection,
|
||||||
)
|
)
|
||||||
|
from metadata.generated.schema.security.client.openMetadataJWTClientConfig import (
|
||||||
|
OpenMetadataJWTClientConfig,
|
||||||
|
)
|
||||||
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
||||||
|
|
||||||
server_config = OpenMetadataConnection(hostPort="http://localhost:8585/api")
|
server_config = OpenMetadataConnection(
|
||||||
|
hostPort="http://localhost:8585/api",
|
||||||
|
authProvider="openmetadata",
|
||||||
|
securityConfig=OpenMetadataJWTClientConfig(
|
||||||
|
jwtToken="<token>"
|
||||||
|
),
|
||||||
|
)
|
||||||
metadata = OpenMetadata(server_config)
|
metadata = OpenMetadata(server_config)
|
||||||
|
|
||||||
assert metadata.health_check() # Will fail if we cannot reach the server
|
assert metadata.health_check() # Will fail if we cannot reach the server
|
||||||
|
199
openmetadata-docs/content/sdk/python/ingestion/tags.md
Normal file
199
openmetadata-docs/content/sdk/python/ingestion/tags.md
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
---
|
||||||
|
title: Python SDK for Tags
|
||||||
|
slug: /sdk/python/ingestion/tags
|
||||||
|
---
|
||||||
|
|
||||||
|
# Python SDK for Tags
|
||||||
|
|
||||||
|
In this guide, we will use the Python SDK to create Tags.
|
||||||
|
|
||||||
|
A **prerequisite** for this section is to have previously gone through the following [docs](/sdk/python).
|
||||||
|
|
||||||
|
In the following sections we will:
|
||||||
|
- Create a Database Service, a Database, a Schema and one Table,
|
||||||
|
- Create a Classification,
|
||||||
|
- Create a Tag for the Classification and add it to the Table.
|
||||||
|
|
||||||
|
## Creating the Entities
|
||||||
|
|
||||||
|
To prepare the necessary ingredients, execute the following steps.
|
||||||
|
|
||||||
|
### 1. Preparing the Client
|
||||||
|
|
||||||
|
```python
|
||||||
|
from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import (
|
||||||
|
OpenMetadataConnection,
|
||||||
|
)
|
||||||
|
from metadata.generated.schema.security.client.openMetadataJWTClientConfig import (
|
||||||
|
OpenMetadataJWTClientConfig,
|
||||||
|
)
|
||||||
|
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
||||||
|
|
||||||
|
server_config = OpenMetadataConnection(
|
||||||
|
hostPort="http://localhost:8585/api",
|
||||||
|
authProvider="openmetadata",
|
||||||
|
securityConfig=OpenMetadataJWTClientConfig(
|
||||||
|
jwtToken="<token>"
|
||||||
|
),
|
||||||
|
)
|
||||||
|
metadata = OpenMetadata(server_config)
|
||||||
|
|
||||||
|
assert metadata.health_check() # Will fail if we cannot reach the server
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Creating the Database Service
|
||||||
|
|
||||||
|
We are mocking a MySQL instance. Note how we need to pass the right configuration class `MysqlConnection`, as a
|
||||||
|
parameter for the generic `DatabaseConnection` type.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from metadata.generated.schema.api.services.createDatabaseService import (
|
||||||
|
CreateDatabaseServiceRequest,
|
||||||
|
)
|
||||||
|
from metadata.generated.schema.entity.services.connections.database.mysqlConnection import (
|
||||||
|
MysqlConnection,
|
||||||
|
)
|
||||||
|
from metadata.generated.schema.entity.services.databaseService import (
|
||||||
|
DatabaseConnection,
|
||||||
|
DatabaseService,
|
||||||
|
DatabaseServiceType,
|
||||||
|
)
|
||||||
|
|
||||||
|
db_service = CreateDatabaseServiceRequest(
|
||||||
|
name="test-service-db-lineage",
|
||||||
|
serviceType=DatabaseServiceType.Mysql,
|
||||||
|
connection=DatabaseConnection(
|
||||||
|
config=MysqlConnection(
|
||||||
|
username="username",
|
||||||
|
password="password",
|
||||||
|
hostPort="http://localhost:1234",
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
db_service_entity = metadata.create_or_update(data=db_service)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Creating the Database
|
||||||
|
|
||||||
|
Any Entity that is created and linked to another Entity, has to hold the `EntityReference` to the Entity it
|
||||||
|
relates to. In this case, a Database is bound to a specific service.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from metadata.generated.schema.api.data.createDatabase import CreateDatabaseRequest
|
||||||
|
from metadata.generated.schema.type.entityReference import EntityReference
|
||||||
|
|
||||||
|
create_db = CreateDatabaseRequest(
|
||||||
|
name="test-db",
|
||||||
|
service=EntityReference(
|
||||||
|
id=db_service_entity.id, type="databaseService"
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
create_db_entity = metadata.create_or_update(data=create_db)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Creating the Schema
|
||||||
|
|
||||||
|
The same happens with the Schemas. They are related to a Database.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from metadata.generated.schema.api.data.createDatabaseSchema import (
|
||||||
|
CreateDatabaseSchemaRequest,
|
||||||
|
)
|
||||||
|
|
||||||
|
create_schema = CreateDatabaseSchemaRequest(
|
||||||
|
name="test-schema", database=EntityReference(
|
||||||
|
id=create_db_entity.id, name="test-db", type="database"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
create_schema_entity = metadata.create_or_update(data=create_schema)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Creating the Table
|
||||||
|
|
||||||
|
And finally, Tables are contained in a specific Schema, so we use the `EntityReference` here as well.
|
||||||
|
|
||||||
|
We are doing a simple example with a single column.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from metadata.generated.schema.api.data.createTable import CreateTableRequest
|
||||||
|
from metadata.generated.schema.entity.data.table import Column, DataType
|
||||||
|
|
||||||
|
table = CreateTableRequest(
|
||||||
|
name="my_table",
|
||||||
|
databaseSchema=EntityReference(
|
||||||
|
id=create_schema_entity.id, name="test-schema", type="databaseSchema"
|
||||||
|
),
|
||||||
|
columns=[Column(name="id", dataType=DataType.BIGINT)],
|
||||||
|
)
|
||||||
|
|
||||||
|
table = metadata.create_or_update(data=table)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Creating the Classification
|
||||||
|
|
||||||
|
Classifications are the entities we use to group tag definitions. Let's create a sample one:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from metadata.generated.schema.api.classification.createClassification import (
|
||||||
|
CreateClassificationRequest,
|
||||||
|
)
|
||||||
|
from metadata.generated.schema.api.classification.createTag import CreateTagRequest
|
||||||
|
|
||||||
|
classification_request=CreateClassificationRequest(
|
||||||
|
name="TestClassification",
|
||||||
|
description="Sample classification.",
|
||||||
|
)
|
||||||
|
|
||||||
|
metadata.create_or_update(classification_request)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. Creating the Tag
|
||||||
|
|
||||||
|
Once there is an existing classification, we create tags within that given classification:
|
||||||
|
|
||||||
|
```python
|
||||||
|
tag_request=CreateTagRequest(
|
||||||
|
classification=classification_request.name,
|
||||||
|
name="TestTag",
|
||||||
|
description="Sample Tag.",
|
||||||
|
)
|
||||||
|
|
||||||
|
metadata.create_or_update(tag_request)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. Tagging a Table
|
||||||
|
|
||||||
|
Now that we have the Tag, we can proceed and tag a specific asset. In this example, we'll
|
||||||
|
tag the Table we created above. For that, the API uses a PATCH request, but the Python SDK has
|
||||||
|
a helper method that handles most of the work:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from metadata.generated.schema.entity.data.table import Table
|
||||||
|
|
||||||
|
metadata.patch_tag(
|
||||||
|
entity=Table,
|
||||||
|
entity_id=table.id,
|
||||||
|
tag_fqn="TestClassification.TestTag",
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
If we now check the tags for the Table, the new tag will be appearing in there.
|
||||||
|
|
||||||
|
Note that we now used the `patch_tag` method because the Table already existed. If we can
|
||||||
|
control the Tag creation process when the Table metadata is generated, we can assign
|
||||||
|
the tags in the `tags` property of `CreateTableRequest`.
|
||||||
|
|
||||||
|
### 9. Tagging a Column
|
||||||
|
|
||||||
|
The same idea can be replicated to tag a column:
|
||||||
|
|
||||||
|
```python
|
||||||
|
metadata.patch_column_tag(
|
||||||
|
entity_id=table.id,
|
||||||
|
tag_fqn="TestClassification.TestTag",
|
||||||
|
column_name="id",
|
||||||
|
)
|
||||||
|
```
|
Loading…
x
Reference in New Issue
Block a user