Tina4

Tina4-Python - Database Class {#connections}#

๐Ÿ”ฅ 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:")โ€‹# PostgreSQLdba = Database("psycopg2:localhost/5432:mydb", "postgres", "password")โ€‹# MySQL / MariaDBdba = Database("mysql.connector:localhost/3306:mydb", "root", "secret")โ€‹# MSSQLdba = Database("pymssql:localhost/1433:mydb", "sa", "Password123")โ€‹# Firebirddba = 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 {#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            # intresult.error            # None or error messageresult.to_json()        # โ†’ JSON stringresult.to_array()       # โ†’ list of recordsresult.to_paginate()    # โ†’ pagination dict with totalsresult.to_crud(request) # โ†’ CRUD HTML interfaceresult.to_csv()         # โ†’ CSV string

Examples {#usage}#

python
db = Database("sqlite3::memory:")โ€‹# Create tabledb.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")โ€‹# Insertdb.insert("users", {"name": "Alice", "age": 30})db.insert("users", [{"name": "Bob", "age": 25}, {"name": "Eve", "age": 35}])โ€‹# Updatedb.update("users", {"id": 1, "age": 31})โ€‹# Deletedb.delete("users", {"id": 2})โ€‹# Selectresult = db.fetch("SELECT * FROM users")print(result.records)           # โ†’ [{'id': 1, 'name': 'Alice', 'age': 31}, ...]print(result.count)             # โ†’ 2โ€‹# With parametersresult = db.fetch("SELECT * FROM users WHERE age > ?", [30])print(result.records[0]["name"])  # โ†’ Aliceโ€‹# Pagination + searchresult = db.fetch(    "SELECT * FROM users",    limit=10,    skip=20,    search_columns=["name"],    search="ali")โ€‹db.close()

Transactions {#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}#

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 enginedb.execute("CREATE TABLE users (id INTEGER)")  # creates collectiondb.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.