Recommended

Supercharge Dataverse with Python and Pandas

Introducing DataversePython: A Powerful Python Client for Microsoft Dataverse Dataverse is the heart and soul of Microsoft Power Plat...

How To insert_rows() in DataversePython

How to Use the insert_rows() Method in DataversePython

The insert_rows() method in the DataverseClient class allows you to insert data from a pandas DataFrame into a Microsoft Dataverse entity. This article explains its usage, parameters, and provides practical examples to help you get started.


What is insert_rows()?

The insert_rows() method lets you add multiple records to any Dataverse entity (such as accounts, contacts, or custom tables) by passing a pandas DataFrame. Each row in the DataFrame is sent as a new record to Dataverse.


Method Signature

insert_rows(
    entity: str,
    df: pd.DataFrame
) -> None

Parameters Explained

  • entity (str, required):
    The plural name of the Dataverse entity you want to insert into (e.g., 'accounts', 'contacts').
  • df (pd.DataFrame, required):
    The DataFrame containing the rows to insert. Each column should match a field in the entity schema.

Basic Example: Insert New Accounts

from DataversePython.DataverseClient import DataverseClient
import pandas as pd

# Initialize the client with your configuration file
prod = DataverseClient('sample_config.json')

# Create a DataFrame with new account data
new_accounts = pd.DataFrame([
    {"name": "Contoso Ltd", "emailaddress1": "info@contoso.com"},
    {"name": "Fabrikam Inc", "emailaddress1": "contact@fabrikam.com"}
])

# Insert the new accounts
prod.insert_rows(entity='accounts', df=new_accounts)

Example: Insert Contacts with Basic Fields

# Create a DataFrame for new contacts
contacts = pd.DataFrame([
    {"firstname": "Alice", "lastname": "Smith", "emailaddress1": "alice.smith@example.com"},
    {"firstname": "Bob", "lastname": "Jones", "emailaddress1": "bob.jones@example.com"}
])

prod.insert_rows(entity='contacts', df=contacts)

Example: Insert Contacts with Optionset Fields

# Example: Insert contacts with an optionset (choice) field
        # Assume 'preferredcontactmethodcode' is an optionset field (e.g., 1=Email, 2=Phone)
        contacts_optionset = pd.DataFrame([
            {"firstname": "Charlie", "preferredcontactmethodcode": 1},
            {"firstname": "Dana", "preferredcontactmethodcode": 2}
        ])

        prod.insert_rows(entity='contacts', df=contacts_optionset)
        

Example: Insert Contacts with Lookup Field (parentcustomerid)

# Example: Insert contacts with a lookup field (parentcustomerid)
        # The parentcustomerid field can reference an account or contact (customer lookup)
        # Use the format: {'parentcustomerid_{entity}@odata.bind': '/accounts()'}
        contacts_lookup = pd.DataFrame([
            {
                "firstname": "Eve",
                "lastname": "Adams",
                "emailaddress1": "eve.adams@example.com",
                "parentcustomerid_accounts@odata.bind": "/accounts(00000000-0000-0000-0000-000000000001)"
            },
            {
                "firstname": "Frank",
                "lastname": "Miller",
                "emailaddress1": "frank.miller@example.com",
                "parentcustomerid_contacts@odata.bind": "/contacts(00000000-0000-0000-0000-000000000002)"
            }
        ])

        prod.insert_rows(entity='contacts', df=contacts_lookup)
        

Example: Insert Contacts with Multi-Lookup Field

# Example: Insert contacts with a multi-lookup field
        # Assume 'new_multilookupfield' is a custom multi-lookup field (e.g. 1=training,2=consulting,3=developing)  
        contacts_multilookup = pd.DataFrame([
            {
                "firstname": "Grace",
                "lastname": "Hopper",
                "emailaddress1": "grace.hopper@example.com",
                "new_multilookupfield": "1, 3"
            }
        ])

        prod.insert_rows(entity='contacts', df=contacts_multilookup)
        

Notes and Best Practices

  • Each row in the DataFrame is sent as a separate POST request to Dataverse.
  • If a row fails to insert, the method logs an error (including the error code and response) to DataverseClient.log.
  • Make sure your DataFrame columns match the entity's schema in Dataverse.
  • For large inserts (more than 50k rows), consider batching in multiple DataFrames.
  • A insert_rows_batch() is already on the roadmap 😉

Error Handling

If an insertion fails (e.g., due to validation or permission issues), an error is logged to DataverseClient.log and the method continues with the next row. Always check this log file for troubleshooting.


Tips

  • Always use the plural form of the entity name (e.g., 'accounts', not 'account').
  • Refer to the Microsoft Dataverse Web API documentation for field names and data types.
  • Use the VSCode DataWrangler Extension and Jupyter notebooks for interactive data preparation.

Conclusion

The insert_rows() method makes it easy to add new records to Dataverse entities from pandas DataFrames, enabling seamless integration between Python and Microsoft Dataverse for automation and data migration scenarios.

Happy coding!

No comments:

Post a Comment