dbi beginner

How to execute DELETE queries with WHERE clause in Perl DBI?

Question

How to execute DELETE queries with WHERE clause in Perl DBI?

When working with databases in Perl, the DBI module is the standard interface for executing SQL queries, including DELETE statements. Executing a DELETE query with a WHERE clause involves preparing the SQL statement with placeholders, binding parameters, and then executing it. This approach not only prevents SQL injection vulnerabilities but also improves efficiency if running the query repeatedly.

Key Concepts:

  • DBI: The primary database interface module in Perl.
  • Placeholders (? marks): Bind parameters safely without string concatenation.
  • Prepare and execute: Two-step process: first prepare the statement, then execute it with bound values.
  • Context and Return Value: execute returns number of affected rows, useful to confirm deletion.

Here is a simple, self-contained example that uses an in-memory SQLite database (built-in core SQLite driver in DBI) to demonstrate how to execute a DELETE query with a WHERE clause.


use strict;
use warnings;
use DBI;

# Connect to an in-memory SQLite database
my $dbh = DBI->connect("dbi:SQLite:dbname=:memory:", "", "", { RaiseError => 1, AutoCommit => 1 });

# Create a sample table and insert some data
$dbh->do("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");

$dbh->do("INSERT INTO users (name) VALUES (?)", undef, "Alice");
$dbh->do("INSERT INTO users (name) VALUES (?)", undef, "Bob");
$dbh->do("INSERT INTO users (name) VALUES (?)", undef, "Charlie");

print "Before DELETE:\n";
my $sth = $dbh->prepare("SELECT id, name FROM users");
$sth->execute();
while (my $row = $sth->fetchrow_hashref) {
    print "ID: $row->{id}, Name: $row->{name}\n";
}

# Prepare DELETE statement with WHERE clause
my $delete_sth = $dbh->prepare("DELETE FROM users WHERE name = ?");

my $name_to_delete = 'Bob';

# Execute DELETE statement with bound parameter
my $rows_deleted = $delete_sth->execute($name_to_delete);

print "\nDeleted $rows_deleted row(s) where name is '$name_to_delete'.\n\n";

# Show remaining rows after deletion
print "After DELETE:\n";
$sth->execute();
while (my $row = $sth->fetchrow_hashref) {
    print "ID: $row->{id}, Name: $row->{name}\n";
}

# Disconnect
$dbh->disconnect;

Explanation:

  • DBI->connect: Opens a database connection. Here, SQLite runs entirely in memory, so no external setup needed.
  • $dbh->do: Executes SQL directly (used here for creating table and inserting data).
  • prepare: Prepares the DELETE statement with a placeholder ? for the name.
  • execute($name_to_delete): Binds the value 'Bob' to the placeholder and runs the query.
  • The number of rows deleted is returned by execute, which you can check for success.
  • After deletion, a SELECT query is used to show remaining rows.

Common Pitfalls:

  • Do not interpolate variables directly into your SQL strings due to SQL injection risks. Always use placeholders with prepare and execute.
  • Always check the return value of execute to verify how many rows were affected.
  • Remember to handle errors—here we use RaiseError => 1 to die automatically on DB errors.
  • When deleting large numbers of rows, consider transaction control (commit/rollback) for performance and safety.
  • Make sure your WHERE clause is restrictive enough to avoid deleting unintended rows.

Version Notes:

This example works with Perl 5.10+ and above, and uses only core modules (DBI is standard but may require installation on some systems). SQLite support requires DBD::SQLite, which is widely available but not a core Perl module. Substitute with your preferred DBI driver accordingly.

By following this pattern of preparing your DELETE query with placeholders, and executing with correctly bound parameters, you safely and efficiently perform DELETE operations with WHERE clauses in Perl DBI.

Verified Code

Executed in a sandbox to capture real output. • v5.34.1 • 52ms

Tip: edit code and use “Run (Browser)”. Server runs always execute the published, verified snippet.
STDOUT
Before DELETE:
ID: 1, Name: Alice
ID: 2, Name: Bob
ID: 3, Name: Charlie

Deleted 1 row(s) where name is 'Bob'.

After DELETE:
ID: 1, Name: Alice
ID: 3, Name: Charlie
STDERR
(empty)

Was this helpful?

Related Questions