Files
Sebastian Serfling 12058896c3 Some changes
2025-10-31 18:33:40 +01:00

93 lines
3.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
import adodbapi
import pyodbc
from dotenv import load_dotenv
load_dotenv()
# --- ENV Variablen ---
SDF_LOCAL_PFAD = os.getenv("SDF_LOCAL_PFAD")
SDF_NAME = os.getenv("SDF_NAME", "App.sdf")
sdf_file = os.path.join(SDF_LOCAL_PFAD, SDF_NAME)
MSSQL_CONNECTION_STR = os.getenv("MSSQL_CONNECTION_STR")
tables = [t.strip() for t in os.getenv("TABLES", "").split(",") if t.strip()]
print(f"📂 Verbinde mit SDF: {sdf_file}")
sdf_conn = adodbapi.connect(
f"Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source={sdf_file};Persist Security Info=False;"
)
sdf_cursor = sdf_conn.cursor()
print("🔗 Verbinde mit MSSQL...")
mssql_conn = pyodbc.connect(MSSQL_CONNECTION_STR)
mssql_cursor = mssql_conn.cursor()
# --- Hilfsfunktion zur Datentyp-Konvertierung ---
def sdf_to_mssql_type(sdf_type, length):
sdf_type = sdf_type.lower()
if "int" in sdf_type:
return "INT"
if "float" in sdf_type or "double" in sdf_type:
return "FLOAT"
if "decimal" in sdf_type or "numeric" in sdf_type:
return "DECIMAL(18,2)"
if "datetime" in sdf_type or "date" in sdf_type:
return "DATETIME"
if "bit" in sdf_type or "bool" in sdf_type:
return "BIT"
if "image" in sdf_type or "binary" in sdf_type:
return "VARBINARY(MAX)"
if "ntext" in sdf_type or "text" in sdf_type:
return "NVARCHAR(MAX)"
if "char" in sdf_type or "string" in sdf_type:
return f"NVARCHAR({length if length and length > 0 else 255})"
return "NVARCHAR(MAX)"
# --- Tabellen erzeugen ---
for table in tables:
print(f"\n📋 Analysiere Tabelle: {table}")
try:
sdf_cursor.execute(f"SELECT * FROM [{table}] WHERE 1=0")
columns = []
column_names = []
for col in sdf_cursor.description:
col_name = col[0]
if col_name.lower() == "id":
# Id-Spalte wird immer INT PRIMARY KEY
columns.append("[Id] INT PRIMARY KEY")
else:
col_type = str(col[1])
col_len = col[3]
sql_type = sdf_to_mssql_type(col_type, col_len)
columns.append(f"[{col_name}] {sql_type}")
column_names.append(col_name)
# Prüfen, ob überhaupt eine Id-Spalte existiert
if "Id" not in column_names and "ID" not in column_names:
print("⚠️ Keine Id-Spalte gefunden füge Id INT PRIMARY KEY hinzu.")
columns.insert(0, "[Id] INT PRIMARY KEY")
create_sql = f"CREATE TABLE [{table}] (\n " + ",\n ".join(columns) + "\n)"
print(create_sql)
try:
mssql_cursor.execute(create_sql)
mssql_conn.commit()
print(f"✅ Tabelle [{table}] in MSSQL erstellt.")
except Exception as inner:
print(f"⚠️ Tabelle [{table}] konnte nicht erstellt werden (vielleicht existiert sie bereits): {inner}")
except Exception as e:
print(f"❌ Fehler beim Lesen von {table}: {e}")
# --- Aufräumen ---
sdf_cursor.close()
sdf_conn.close()
mssql_cursor.close()
mssql_conn.close()
print("\n🏁 Fertig!")