Tina4-Python - Database Class {#connections}#
๐ฅ Hot Tips
- Instantiate
dbain the./src/__init__.py, include withfrom . import dba dbais the recognized global for database handling, but you can use any naming.- Always call
commit()afterinsert/update/deleteunless in a transaction. - Most methods return a
DatabaseResultobject 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 authCore Methods {#core-methods}#
| Method | Description | Returns |
|---|---|---|
execute(sql, params=None) | Run any SQL (CREATE, DROP, INSERT, ...) | Result |
execute_many(sql, params_list) | Bulk insert/update | Result |
insert(table, data) | Smart insert (auto-increment, returns IDs) | Result |
update(table, data, primary_key="id") | Update by PK | bool |
delete(table, filter=None) | Delete by filter dict | bool |
fetch(sql, params=None, **options) | SELECT with pagination & search | Result |
fetch_one(sql, params=None) | Return single row as dict | dict or None |
table_exists(table_name) | Check if table exists | bool |
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 stringExamples {#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 exceptionOne-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#
| SQL | MongoDB |
|---|---|
= | Direct match |
!=, <> | $ne |
>, >=, <, <= | $gt, $gte, $lt, $lte |
LIKE '%text%' | $regex (case-insensitive) |
IN (a, b, c) | $in |
NOT IN (a, b) | $nin |
IS NULL | None |
IS NOT NULL | $ne: None |
BETWEEN a AND b | $gte + $lte |
AND / OR | $and / $or |
Pagination & search#
python
result = db.fetch( "SELECT * FROM users", limit=10, skip=20, search="alice", search_columns=["name", "email"])print(result.total_count) # total matching documentsRETURNING 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.