Skip to content

Tina4-Python - Database Class

🔥 Hot Tips

  • Instantiate dba in the ./src/__init__.py, include with from . import dba
  • dba is the recognized global for database handling, but you can use any naming.
  • Always call commit() after insert/update/delete unless in a transaction.
  • Most methods return a DatabaseResult object which you can transform.

Connection

python
from tina4_python.Database import Database

# SQLite (file)
dba = Database("sqlite3:test.db")

# SQLite (in-memory - perfect for tests)
dba = Database("sqlite3::memory:")

# PostgreSQL
dba = Database("psycopg2:localhost/5432:mydb", "postgres", "password")

# MySQL / MariaDB
dba = Database("mysql.connector:localhost/3306:mydb", "root", "secret")

# MSSQL
dba = Database("pymssql:localhost/1433:mydb", "sa", "Password123")

# Firebird
dba = Database("firebird.driver:localhost/3050:/path/db.fdb", "sysdba", "masterkey")

# MongoDB (pip install pymongo)
dba = Database("pymongo:localhost/27017:mydb")
dba = Database("pymongo:localhost/27017:mydb", "user", "password")  # with auth

Core Methods

MethodDescriptionReturns
execute(sql, params=None)Run any SQL (CREATE, DROP, INSERT, ...)Result
execute_many(sql, params_list)Bulk insert/updateResult
insert(table, data)Smart insert (auto-increment, returns IDs)Result
update(table, data, primary_key="id")Update by PKbool
delete(table, filter=None)Delete by filter dictbool
fetch(sql, params=None, **options)SELECT with pagination & searchResult
fetch_one(sql, params=None)Return single row as dictdict or None
table_exists(table_name)Check if table existsbool
commit(), rollback(), start_transaction()Full transaction control-
close()Close connection-

Result Object

Every query returns a Result with these properties:

python
result.records          # list[dict] or list[tuple]
result.count            # int
result.error            # None or error message
result.to_json()        # → JSON string
result.to_array()       # → list of records
result.to_paginate()    # → pagination dict with totals
result.to_crud(request) # → CRUD HTML interface
result.to_csv()         # → CSV string

Examples

python
db = Database("sqlite3::memory:")

# Create table
db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")

# Insert
db.insert("users", {"name": "Alice", "age": 30})
db.insert("users", [{"name": "Bob", "age": 25}, {"name": "Eve", "age": 35}])

# Update
db.update("users", {"id": 1, "age": 31})

# Delete
db.delete("users", {"id": 2})

# Select
result = db.fetch("SELECT * FROM users")
print(result.records)           # → [{'id': 1, 'name': 'Alice', 'age': 31}, ...]
print(result.count)             # → 2

# With parameters
result = db.fetch("SELECT * FROM users WHERE age > ?", [30])
print(result.records[0]["name"])  # → Alice

# Pagination + search
result = db.fetch(
    "SELECT * FROM users",
    limit=10,
    skip=20,
    search_columns=["name"],
    search="ali"
)

db.close()

Transactions

python
db.start_transaction()
try:
    db.insert("users", {"name": "Risky"})
    db.commit()
except:
    db.rollback()   # automatically rolls back on exception

One-liner Heaven (Tina4 style)

python
Database("sqlite3:test.db").execute("INSERT INTO logs (msg) VALUES (?)", ["Hello Tina4"])

That's it. No models. No config files. No nonsense.

MongoDB

MongoDB uses the same SQL API as all other engines. The SQLToMongo module translates SQL to MongoDB queries transparently, with no new API to learn.

python
db = Database("pymongo:localhost/27017:myapp")

# Works exactly like any other engine
db.execute("CREATE TABLE users (id INTEGER)")  # creates collection
db.insert("users", {"id": 1, "name": "Alice", "email": "alice@test.com"})

result = db.fetch("SELECT * FROM users WHERE name = ?", ["Alice"])
print(result.records)  # → [{'id': 1, 'name': 'Alice', 'email': 'alice@test.com'}]

db.execute("UPDATE users SET name = ? WHERE id = ?", ["Bob", 1])
db.execute("DELETE FROM users WHERE id = ?", [1])

Supported WHERE operators

SQLMongoDB
=Direct match
!=, <>$ne
>, >=, <, <=$gt, $gte, $lt, $lte
LIKE '%text%'$regex (case-insensitive)
IN (a, b, c)$in
NOT IN (a, b)$nin
IS NULLNone
IS NOT NULL$ne: None
BETWEEN a AND b$gte + $lte
AND / OR$and / $or
python
result = db.fetch(
    "SELECT * FROM users",
    limit=10,
    skip=20,
    search="alice",
    search_columns=["name", "email"]
)
print(result.total_count)  # total matching documents

RETURNING emulation

python
result = db.execute(
    "INSERT INTO users (id, name) VALUES (?, ?) RETURNING *",
    [1, "Alice"]
)
print(result.records)  # → [{'id': 1, 'name': 'Alice'}]

Limitations

  • JOINs are not supported: MongoDB is document-based. Use embedded documents or application-level joins.
  • CREATE TABLE maps to collection creation, column definitions are ignored (MongoDB is schema-less).
  • Migrations will create/drop collections but column-level DDL (ALTER TABLE) is a no-op.

Sponsored with 🩵 by Code InfinityCode Infinity