drift/sqlparser/example/sqlparser_example.dart

67 lines
1.9 KiB
Dart

import 'package:sqlparser/sqlparser.dart';
// Example that parses a select statement on some tables defined below and
// prints what columns would be returned by that statement.
void main() {
final engine = SqlEngine()
..registerTableFromSql(
'''
CREATE TABLE frameworks (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL,
popularity REAL NOT NULL
);
''',
)
..registerTableFromSql(
'''
CREATE TABLE languages (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
''',
)
..registerTableFromSql(
'''
CREATE TABLE uses_language (
framework INTEGER NOT NULL REFERENCES frameworks (id),
language INTEGER NOT NULL REFERENCES languages (id),
PRIMARY KEY (framework, language)
);
''',
);
// Use SqlEngine.analyze to parse a single sql statement and analyze it.
// Analysis can be used to find semantic errors, lints and inferred types of
// expressions or result columns.
final result = engine.analyze('''
SELECT f.* FROM frameworks f
INNER JOIN uses_language ul ON ul.framework = f.id
INNER JOIN languages l ON l.id = ul.language
WHERE l.name = 'Dart'
ORDER BY f.name ASC, f.popularity DESC
LIMIT 5 OFFSET 5 * 3
''');
result.errors.forEach(print);
final select = result.root as SelectStatement;
final columns = select.resolvedColumns!;
print('the query returns ${columns.length} columns');
for (final column in columns) {
final type = result.typeOf(column);
print('${column.name}, which will be a $type');
}
}
extension on SqlEngine {
/// Utility function that parses a `CREATE TABLE` statement and registers the
/// created table to the engine.
void registerTableFromSql(String createTable) {
final stmt = parse(createTable).rootNode as CreateTableStatement;
registerTable(schemaReader.read(stmt));
}
}