Balzer-WaagenDaten/test_odb.py

93 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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!")