1+ '''
2+ wouldn't it be nice if I could have something that
3+ veries the same SQL code -> SQLModel code consequence
4+ across all implementations? let's try
5+ '''
6+
7+ import sqlite3
8+ from pathlib import Path
9+ from tempfile import tempdir
10+ from typing import Callable
11+
12+ from uuid import uuid4
13+
14+ from sqlmodelgen import (
15+ gen_code_from_sql ,
16+ gen_code_from_sqlite ,
17+ )
18+
19+ from helpers .helpers import collect_code_info
20+
21+ CodeGenFunc = Callable [[str , bool ], str ]
22+
23+ def gen_from_parse (sql : str , rels : bool ) -> str :
24+ return gen_code_from_sql (sql , rels )
25+
26+ def gen_from_sqlite (sql : str , rels : bool ) -> str :
27+ # TODO: prepare interface for possibly several sql
28+ # statements
29+ sqlite_path = Path (tempdir ) / f"{ uuid4 ()} .sqlite"
30+
31+ with sqlite3 .connect (sqlite_path ) as conn :
32+ cursor = conn .cursor ()
33+ cursor .execute (sql )
34+ conn .commit ()
35+
36+ return gen_code_from_sqlite (str (sqlite_path ), rels )
37+
38+ codegens : list [CodeGenFunc ] = [
39+ gen_from_parse ,
40+ gen_from_sqlite ,
41+ ]
42+ codegen_ids = [codegen .__name__ for codegen in codegens ]
43+
44+ def verify (codegen : CodeGenFunc , sql : str , expected : str , rels : bool ):
45+ generated = codegen (sql , rels )
46+ assert collect_code_info (generated ) == collect_code_info (expected )
47+
48+ import pytest
49+ @pytest .mark .parametrize ("codegen" , codegens , ids = codegen_ids )
50+ def test_basic (codegen ):
51+ verify (
52+ codegen = codegen ,
53+ sql = '''CREATE TABLE Persons (
54+ PersonID int NOT NULL,
55+ LastName varchar NOT NULL,
56+ FirstName varchar NOT NULL,
57+ Address varchar NOT NULL,
58+ City varchar NOT NULL
59+ );''' ,
60+ expected = '''from sqlmodel import SQLModel
61+
62+ class Persons(SQLModel, table = True):
63+ __tablename__ = 'Persons'
64+
65+ PersonID: int
66+ LastName: str
67+ FirstName: str
68+ Address: str
69+ City: str''' ,
70+ rels = False
71+ )
0 commit comments