72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
import fdb
|
|
|
|
con = fdb.connect(
|
|
host='192.168.1.4',
|
|
database=r'z:\MEDICUS 3\data\medicus.FDB',
|
|
user='sysdba',
|
|
password='masterkey',
|
|
charset='WIN1250'
|
|
)
|
|
cur = con.cursor()
|
|
|
|
# Query all user tables and their columns
|
|
cur.execute("""
|
|
SELECT
|
|
rf.rdb$relation_name AS table_name,
|
|
rf.rdb$field_name AS column_name,
|
|
f.rdb$field_type AS field_type,
|
|
f.rdb$field_sub_type AS field_subtype,
|
|
f.rdb$field_length AS field_length,
|
|
f.rdb$field_precision AS field_precision,
|
|
f.rdb$field_scale AS field_scale,
|
|
f.rdb$null_flag AS not_null
|
|
FROM rdb$relation_fields rf
|
|
JOIN rdb$fields f ON rf.rdb$field_source = f.rdb$field_name
|
|
JOIN rdb$relations r ON rf.rdb$relation_name = r.rdb$relation_name
|
|
WHERE r.rdb$system_flag = 0 -- only user tables
|
|
ORDER BY rf.rdb$relation_name, rf.rdb$field_position
|
|
""")
|
|
|
|
# helper to translate Firebird numeric codes to SQL types
|
|
fb_types = {
|
|
7: "SMALLINT",
|
|
8: "INTEGER",
|
|
10: "FLOAT",
|
|
12: "DATE",
|
|
13: "TIME",
|
|
14: "CHAR",
|
|
16: "BIGINT/NUMERIC",
|
|
27: "DOUBLE",
|
|
35: "TIMESTAMP",
|
|
37: "VARCHAR",
|
|
261:"BLOB"
|
|
}
|
|
|
|
schema = {}
|
|
for row in cur.fetchall():
|
|
table = row[0].strip()
|
|
column = row[1].strip()
|
|
ftype = fb_types.get(row[2], f"TYPE{row[2]}")
|
|
subtype = row[3]
|
|
length = row[4]
|
|
precision = row[5]
|
|
scale = row[6]
|
|
not_null = bool(row[7])
|
|
|
|
# Build human-readable type
|
|
if ftype in ("CHAR","VARCHAR"):
|
|
dtype = f"{ftype}({length})"
|
|
elif ftype == "BIGINT/NUMERIC" and precision:
|
|
dtype = f"NUMERIC({precision},{-scale})"
|
|
else:
|
|
dtype = ftype
|
|
|
|
coldef = f"{column} {dtype}{' NOT NULL' if not_null else ''}"
|
|
schema.setdefault(table, []).append(coldef)
|
|
|
|
# Pretty print
|
|
for t, cols in schema.items():
|
|
print(f"\nTable: {t}")
|
|
for c in cols:
|
|
print(" ", c)
|