Quick Start
This guide will help you get started with sqlmeta quickly.
Creating Tables
from sqlmeta import Table, SqlColumn, SqlConstraint, ConstraintType
# Define a simple table
users_table = Table(
name="users",
schema="public",
dialect="postgresql",
columns=[
SqlColumn("id", "SERIAL", is_primary_key=True),
SqlColumn("email", "VARCHAR(255)", is_nullable=False),
SqlColumn("name", "VARCHAR(100)", is_nullable=False),
SqlColumn("created_at", "TIMESTAMP", default_value="CURRENT_TIMESTAMP"),
],
constraints=[
SqlConstraint(
constraint_type=ConstraintType.UNIQUE,
name="uq_users_email",
column_names=["email"]
)
]
)
# Generate CREATE TABLE statement
print(users_table.create_statement)
Schema Comparison
Compare two table definitions to detect differences:
from sqlmeta.comparison.comparator import ObjectComparator
# Define source and target tables
source_table = Table(
name="users",
columns=[
SqlColumn("id", "INTEGER", is_primary_key=True),
SqlColumn("name", "VARCHAR(100)"),
]
)
target_table = Table(
name="users",
columns=[
SqlColumn("id", "INTEGER", is_primary_key=True),
SqlColumn("name", "VARCHAR(100)"),
SqlColumn("email", "VARCHAR(255)", is_nullable=False),
]
)
# Compare tables
comparator = ObjectComparator(dialect="postgresql")
diff = comparator.compare_tables(source_table, target_table)
if diff.has_diffs:
print(f"Severity: {diff.severity.value}")
print(f"Missing columns: {diff.missing_columns}")
print(f"Extra columns: {diff.extra_columns}")
for col_diff in diff.modified_columns:
print(f"Column '{col_diff.column_name}' changed:")
if col_diff.type_mismatch:
print(f" Type: {col_diff.source_type} -> {col_diff.target_type}")
if col_diff.nullable_mismatch:
print(f" Nullable changed")
SQLAlchemy Integration
Convert between sqlmeta and SQLAlchemy:
from sqlalchemy import MetaData
from sqlmeta.adapters.sqlalchemy import to_sqlalchemy, from_sqlalchemy
# Convert sqlmeta Table to SQLAlchemy Table
metadata = MetaData()
sa_table = to_sqlalchemy(users_table, metadata)
# Use with SQLAlchemy
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
sa_table.create(engine)
# Convert back to sqlmeta
sqlmeta_table = from_sqlalchemy(sa_table)
Pydantic Integration
Generate Pydantic models from tables:
from sqlmeta.adapters.pydantic import to_pydantic
# Generate Pydantic model
UserModel = to_pydantic(users_table)
# Use the model
user = UserModel(
id=1,
email="user@example.com",
name="John Doe",
created_at="2024-01-01T00:00:00"
)
# Serialize
print(user.model_dump_json())
Alembic Integration
Generate Alembic migrations:
from sqlmeta.adapters.alembic import generate_operations
# Compare tables and generate operations
operations = generate_operations(
source_table=old_table,
target_table=new_table,
dialect="postgresql"
)
# Operations can be used in Alembic migration scripts
for op in operations:
print(op)
Serialization
Export and import table definitions:
import json
# Export to dictionary
table_dict = users_table.to_dict()
# Save to JSON
with open("schema.json", "w") as f:
json.dump(table_dict, f, indent=2)
# Load from JSON
with open("schema.json", "r") as f:
loaded_dict = json.load(f)
# Recreate table
users_table_copy = Table.from_dict(loaded_dict)
Working with Views
from sqlmeta.objects.view import View
# Create a view
users_view = View(
name="active_users",
schema="public",
definition="SELECT * FROM users WHERE active = true",
dialect="postgresql"
)
# Materialized view (PostgreSQL)
mat_view = View(
name="users_summary",
schema="public",
definition="SELECT COUNT(*) as total FROM users",
materialized=True,
dialect="postgresql"
)
Working with Procedures
from sqlmeta.objects.procedure import Procedure
# Create a stored procedure
proc = Procedure(
name="update_user_email",
schema="public",
body="""
BEGIN
UPDATE users SET email = p_email WHERE id = p_id;
END;
""",
parameters=["p_id INTEGER", "p_email VARCHAR"],
dialect="postgresql"
)
Next Steps
Explore the API Reference for detailed API documentation
Read the Guides for more advanced usage patterns
Check out the examples in the GitHub repository