SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
Database API
Your new friend
DrupalCamp Spain 2014
Francisco Alonso Borragán
About me
Francisco Alonso Borragán
Drupal Developer
www.kikoalonsob.com
IRC #drupal_es : kikoalonsob
Twitter : @kikoalonsob
Index
1. Intro
2. Static queries
3. Dynamic queries
1. Select queries
2. Insert queries
3. Update queries
4. Delete queries
4. Query alteration
5. Working against other DB
6. Questions
Intro
Abstraction layer for accessing database servers
Support multiple database servers
Dynamic construction of queries
Enforce security checks and good practices
Provide an interface for intercept and modify queries
Static queries
Static queries
Explicit query string (Better for performance)
Used for simple select queries
Returns a prepared statement object, already executed
db_query($query,array$args=array(),array$options=array());
Static queries
$uid=1;
$result=db_query('SELECTn.nid,n.title,n.created
FROM{node}nWHEREn.uid=:uid',
array(':uid'=>$uid),
array('fetch'=>PDO::FETCH_ASSOC)
);
Prefixing
All table names must be wrapped in { }
Static queries
$uid=1;
$result=db_query('SELECTn.nid,n.title,n.created
FROM{node}nWHEREn.uid=:uid',
array(':uid'=>$uid),
array('fetch'=>PDO::FETCH_ASSOC)
);
Placeholders
Literal or an array that will be inserted into a query for execution
Static queries
$uid=1;
$result=db_query('SELECTn.nid,n.title,n.created
FROM{node}nWHEREn.uid=:uid',
array(':uid'=>$uid),
array('fetch'=>PDO::FETCH_ASSOC)
);
Query options
Set the query behavior (typically only two directives)
target (master,slave)
fetch (PDO::FETCH_OBJ, PDO::FETCH_ASSOC, etc)
Static queries
$uid=1;
$result=db_query('SELECTn.nid,n.title,n.created
FROM{node}nWHEREn.uid=:uid',
array(':uid'=>$uid),
array('fetch'=>PDO::FETCH_ASSOC)
);
and...
how to use the result?
Iterating over the result
with a foreach loop...
foreach($resultas$record){
//Dosomethingwitheach$record
}
Iterating over the result
...or with a while loop
if($result){
while($record=$result->fetch()){
//Dosomethingwitheach$record
}
}
Instead of use $result->fetch(), we can use:
$result->fetchAssoc()//tofetchanassociativearray
$result->fetchObject()//tofetchanobject
$result->fetchField($column_index)//tofetchjustasinglefield
All results at once into an
array
//Indexedarray
$result->fetchAll()
//Associativearraykeyedby$fieldvalue
$result->fetchAllAssoc($field)
//associativearrayoffield1=>field2
$result->fetchAllKeyed()
//associativearrayoffieldI=>fieldj
$result->fetchAllKeyed(i,j)
//Singlearray
$result->fetchCol(i=0)
Dynamic
queries
Dynamic
queries
Dynamically built
Used for some select queries
Used for all insert, update, delete and merge queries
Select queries
Always start using
$query=db_select($table,$alias=NULL,array$options=array());
and need at least one field
$query->fields(‘table_or_alias’,array(‘field_1’,’field_2’));
$query->fields(‘table_or_alias’);//Alltablefields
Joins
You can add one or more joins
$query->join($table,$alias=NULL,$condition=NULL,$arguments=array());
* joincan be replaced by innerJoin, rightJoinor leftJointoo.
Conditional clauses
$query->condition($field,$value=NULL,$operator=NULL);
$operatoraccepts =, <, >=, IN, LIKE, BETWEEN, etc…
By default, conditions are concatenated with AND
Use db_and(), db_or()or db_xor()to overwrite it
db_or=db_or();
$db_or->condition(‘type’,‘page’,‘=’);
$db_or->condition(‘field_1’,array(12,15),‘IN’);
$query->condition($db_or);
Ordering
$query->orderBy($field,$direction='ASC')
Grouping
$query->groupBy($field)
Ranges and limits
$query->range($start=NULL,$length=NULL)
how to use the result?
Remember: db_query()returns a prepared statement object, already
executed
But ... db_select()returns a SelectQuery object
Now, you can use the $resultlike in static queries
$result=$query->execute()
Insert queries
Always start using:
$query=db_insert($table,array$options=array());
We have to specify values with fields($value)function
Compact form: The preferred form for most Insert queries
Degenerate form: Useful for running a multi-insert query
Compact form
A simple $key => $valuearray where $keyis the field name.
$query=->fields(array(
'title'=>'Example',
'uid'=>1,
)
)
$query->execute();
Degenerate form
fields()only specifies field names
values()specifies a $key => $valuearray
$query=db_insert('node');
$query->fields(array('title','uid'));
$values=array(
array('title'=>'Example','uid'=>1),
array('title'=>'Example2','uid'=>1)
);
foreach($valuesas$record){
$query->values($record);
}
$query->execute();
Insert based on the result of a select
Build the select query, but not execute!!
$query=db_insert('node');
->from($select);
$query->execute();
Update queries
Similar to insert queries, start using
$query=db_update($table,array$options=array());
and continuate specifying fields (like in insert queries) and conditions
$query->fields($table_alias,array$fields=array())
->condition($field,$value,$operator);
$query->execute();
Delete queries
Yes... start using
$query=db_delete($table,array$options=array());
and continue with a condition
$query->condition($field,$value,$operator)
->execute();
Query alteration
Most interesting feature of this API (IMHO)
Allow other modules to alter queries on the fly
Preparing your query
Add aone or more tags to identify the query
$query->addTag('myTag');
Attach meta data to provide additional context (Opt.)
$query->addMetaData('node',$node);
How to modify a query?
In your custom module, you can use
hook_query_alter(QueryAlterableInterface$query)
//or
hook_query_TAG_alter(QueryAlterableInterface$query)
and inside them...
$query->hasTag($tag);
$query->hasAnyTag($tag_1,$tag_2);
$query->hasAllTags($tag_1,$tag_2);
$query->getMetaData($key);
In your mymodule.views.inc
hook_views_query_alter(&$view,&$query);
Can I modify a views query?
Yes, you can!
Working against
other DB
In your settings.php:
$databases=array();
$databases['default']['default']=array(
//Drupal'sdefaultcredentialshere.
);
$databases['my_other_db']['default']=array(
//Yoursecondarydatabase'scredentialshere.
);
Working against
other DB
In your module
db_set_active('my_other_db');
db_set_active();//Connecttodefault
Working against
other DB
You can define the connection directly in your module
$my_other_db=array(
'database'=>'my_other_db',
'username'=>'username',
'password'=>'password',
'host'=>'localhost',
'driver'=>'mysql',
);
Database::addConnectionInfo('YourDatabaseKey','default',$my_other_db);
db_set_active('YourDatabaseKey');
2
thanks

Weitere ähnliche Inhalte

Was ist angesagt?

DrupalCamp Foz - Novas APIs Drupal 7
DrupalCamp Foz - Novas APIs Drupal 7DrupalCamp Foz - Novas APIs Drupal 7
DrupalCamp Foz - Novas APIs Drupal 7
chuvainc
 
Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3
Fabien Potencier
 
Doctrine fixtures
Doctrine fixturesDoctrine fixtures
Doctrine fixtures
Bill Chang
 

Was ist angesagt? (19)

DrupalCamp Foz - Novas APIs Drupal 7
DrupalCamp Foz - Novas APIs Drupal 7DrupalCamp Foz - Novas APIs Drupal 7
DrupalCamp Foz - Novas APIs Drupal 7
 
Php 101: PDO
Php 101: PDOPhp 101: PDO
Php 101: PDO
 
Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3
 
Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate Frameworks
 
The Origin of Lithium
The Origin of LithiumThe Origin of Lithium
The Origin of Lithium
 
Everything About PowerShell
Everything About PowerShellEverything About PowerShell
Everything About PowerShell
 
Future of HTTP in CakePHP
Future of HTTP in CakePHPFuture of HTTP in CakePHP
Future of HTTP in CakePHP
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
Unit testing zend framework apps
Unit testing zend framework appsUnit testing zend framework apps
Unit testing zend framework apps
 
50 Laravel Tricks in 50 Minutes
50 Laravel Tricks in 50 Minutes50 Laravel Tricks in 50 Minutes
50 Laravel Tricks in 50 Minutes
 
PHP Language Trivia
PHP Language TriviaPHP Language Trivia
PHP Language Trivia
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
 
Oops in php
Oops in phpOops in php
Oops in php
 
Doctrine fixtures
Doctrine fixturesDoctrine fixtures
Doctrine fixtures
 
The State of Lithium
The State of LithiumThe State of Lithium
The State of Lithium
 
Laravel
LaravelLaravel
Laravel
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of Lithium
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix it
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 

Andere mochten auch

CapitalCamp Features
CapitalCamp FeaturesCapitalCamp Features
CapitalCamp Features
Phase2
 
Polizze C.A.R. e E.A.R - Copertura dei danni per tutti gli impianti di produz...
Polizze C.A.R. e E.A.R - Copertura dei danni per tutti gli impianti di produz...Polizze C.A.R. e E.A.R - Copertura dei danni per tutti gli impianti di produz...
Polizze C.A.R. e E.A.R - Copertura dei danni per tutti gli impianti di produz...
Ergowind srl
 
Arts and bots
Arts and botsArts and bots
Arts and bots
colbert6
 
Facebook screenshots
Facebook screenshotsFacebook screenshots
Facebook screenshots
colbert6
 
Assure method
Assure methodAssure method
Assure method
colbert6
 
Assure method assignment
Assure method assignmentAssure method assignment
Assure method assignment
colbert6
 
наталія боднар презентація
наталія боднар презентаціянаталія боднар презентація
наталія боднар презентація
Natalya Bodnar
 
Unit plan revised
Unit plan revisedUnit plan revised
Unit plan revised
colbert6
 
Radiographic Artifacts In Animals By Dr.Amandeep GADVASU
Radiographic Artifacts In Animals By Dr.Amandeep GADVASURadiographic Artifacts In Animals By Dr.Amandeep GADVASU
Radiographic Artifacts In Animals By Dr.Amandeep GADVASU
Amen Deep
 

Andere mochten auch (20)

Smc capital camp 2014
Smc capital camp 2014Smc capital camp 2014
Smc capital camp 2014
 
CapitalCamp Features
CapitalCamp FeaturesCapitalCamp Features
CapitalCamp Features
 
Slick Data Sharding: Slides from DrupalCon London
Slick Data Sharding: Slides from DrupalCon LondonSlick Data Sharding: Slides from DrupalCon London
Slick Data Sharding: Slides from DrupalCon London
 
Zuluk | Zuluk Package | Zuluk Silk Route | Zuluk Tour
Zuluk | Zuluk Package | Zuluk Silk Route | Zuluk TourZuluk | Zuluk Package | Zuluk Silk Route | Zuluk Tour
Zuluk | Zuluk Package | Zuluk Silk Route | Zuluk Tour
 
OA2 for Goverment
OA2 for GovermentOA2 for Goverment
OA2 for Goverment
 
Unit Plan PowerPoint
Unit Plan PowerPointUnit Plan PowerPoint
Unit Plan PowerPoint
 
Polizze C.A.R. e E.A.R - Copertura dei danni per tutti gli impianti di produz...
Polizze C.A.R. e E.A.R - Copertura dei danni per tutti gli impianti di produz...Polizze C.A.R. e E.A.R - Copertura dei danni per tutti gli impianti di produz...
Polizze C.A.R. e E.A.R - Copertura dei danni per tutti gli impianti di produz...
 
ASSURE method
ASSURE methodASSURE method
ASSURE method
 
Arts and bots
Arts and botsArts and bots
Arts and bots
 
I meccanismi di incentivazione delle fonti rinnovabili: presente e futuro
I meccanismi di incentivazione delle fonti rinnovabili: presente e futuroI meccanismi di incentivazione delle fonti rinnovabili: presente e futuro
I meccanismi di incentivazione delle fonti rinnovabili: presente e futuro
 
Facebook screenshots
Facebook screenshotsFacebook screenshots
Facebook screenshots
 
Assure method
Assure methodAssure method
Assure method
 
Assure method assignment
Assure method assignmentAssure method assignment
Assure method assignment
 
наталія боднар презентація
наталія боднар презентаціянаталія боднар презентація
наталія боднар презентація
 
Chocolate toxicity in animals by Dr.Amandeep
Chocolate toxicity in animals by Dr.AmandeepChocolate toxicity in animals by Dr.Amandeep
Chocolate toxicity in animals by Dr.Amandeep
 
Unit plan revised
Unit plan revisedUnit plan revised
Unit plan revised
 
Calf bloat /abomasal tympany by Dr.Amandeep
Calf bloat /abomasal tympany by Dr.AmandeepCalf bloat /abomasal tympany by Dr.Amandeep
Calf bloat /abomasal tympany by Dr.Amandeep
 
LO SVILUPPO DELL’EOLICO DI PICCOLA TAGLIA
LO SVILUPPO DELL’EOLICO DI PICCOLA TAGLIALO SVILUPPO DELL’EOLICO DI PICCOLA TAGLIA
LO SVILUPPO DELL’EOLICO DI PICCOLA TAGLIA
 
Radiographic Artifacts In Animals By Dr.Amandeep GADVASU
Radiographic Artifacts In Animals By Dr.Amandeep GADVASURadiographic Artifacts In Animals By Dr.Amandeep GADVASU
Radiographic Artifacts In Animals By Dr.Amandeep GADVASU
 
Rodenticide Toxicity In Animals by Dr.Amandeep
Rodenticide Toxicity In Animals by Dr.AmandeepRodenticide Toxicity In Animals by Dr.Amandeep
Rodenticide Toxicity In Animals by Dr.Amandeep
 

Ähnlich wie Database API, your new friend

Php tips-and-tricks4128
Php tips-and-tricks4128Php tips-and-tricks4128
Php tips-and-tricks4128
PrinceGuru MS
 
Zf Zend Db by aida
Zf Zend Db by aidaZf Zend Db by aida
Zf Zend Db by aida
waraiotoko
 
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
MongoSF
 
From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)
Night Sailer
 

Ähnlich wie Database API, your new friend (20)

Spl Not A Bridge Too Far phpNW09
Spl Not A Bridge Too Far phpNW09Spl Not A Bridge Too Far phpNW09
Spl Not A Bridge Too Far phpNW09
 
Quebec pdo
Quebec pdoQuebec pdo
Quebec pdo
 
php2.pptx
php2.pptxphp2.pptx
php2.pptx
 
Difference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHPDifference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHP
 
Php tips-and-tricks4128
Php tips-and-tricks4128Php tips-and-tricks4128
Php tips-and-tricks4128
 
Zf Zend Db by aida
Zf Zend Db by aidaZf Zend Db by aida
Zf Zend Db by aida
 
Using web2py's DAL in other projects or frameworks
Using web2py's DAL in other projects or frameworksUsing web2py's DAL in other projects or frameworks
Using web2py's DAL in other projects or frameworks
 
Quebec pdo
Quebec pdoQuebec pdo
Quebec pdo
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
Sqlite perl
Sqlite perlSqlite perl
Sqlite perl
 
Php summary
Php summaryPhp summary
Php summary
 
CodeIgniter Class Reference
CodeIgniter Class ReferenceCodeIgniter Class Reference
CodeIgniter Class Reference
 
Mongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg SolutionsMongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg Solutions
 
Working with databases
Working with databasesWorking with databases
Working with databases
 
MYSQL - PHP Database Connectivity
MYSQL - PHP Database ConnectivityMYSQL - PHP Database Connectivity
MYSQL - PHP Database Connectivity
 
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
 
From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
M.TECH 1ST SEM COMPUTER SCIENCE ADBMS LAB PROGRAMS
M.TECH 1ST SEM COMPUTER SCIENCE ADBMS LAB PROGRAMSM.TECH 1ST SEM COMPUTER SCIENCE ADBMS LAB PROGRAMS
M.TECH 1ST SEM COMPUTER SCIENCE ADBMS LAB PROGRAMS
 
RMySQL Tutorial For Beginners
RMySQL Tutorial For BeginnersRMySQL Tutorial For Beginners
RMySQL Tutorial For Beginners
 

Kürzlich hochgeladen

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Kürzlich hochgeladen (20)

presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 

Database API, your new friend