Konwertuj mdf do sqlite

Konwertuj MDF na SQLITE

Konwertuj dane MDF SQL Server do przenośnej bazy danych SQLite wraz ze schematem i kontrolą kompatybilności.

Twórz pliki SQLITE online

Nie potrafimy jeszcze odczytać plików MDF, więc tej konwersji nie oferujemy. Jeśli możesz wyeksportować swoją pracę do jednego z tych lub innych formatów, zrobimy z niego SQLITE:

Jak konwertować mdf do sqlite

Baza danych SQL Server może wymagać przekształcenia w przenośny plik SQLite na potrzeby aplikacji desktopowej, wdrożenia wbudowanego, testowania lub dystrybucji bez konieczności korzystania z instancji SQL Server. Konwersja polega na eksporcie między silnikami baz danych, a nie na prostej zmianie rozszerzenia pliku: plik MDF musi najpierw zostać otwarty przez SQL Server, a następnie jego schemat i wiersze muszą zostać skopiowane do SQLite.

Czym jest format MDF

MDF to podstawowy format pliku danych używany przez Microsoft SQL Server. Zawiera obiekty bazy danych, takie jak tabele, indeksy, widoki, procedury składowane i dane tabel; towarzyszący mu plik .ldf zwykle zawiera dziennik transakcji.

Z plikami MDF można się spotkać podczas otrzymywania kopii zapasowej bazy danych SQL Server lub odłączonej bazy danych, kopiowania bazy danych między serwerami Windows albo pracy z aplikacjami utworzonymi w oparciu o SQL Server. Microsoft SQL Server, SQL Server Express, SQL Server Developer oraz SQL Server LocalDB mogą dołączać i odczytywać pliki MDF. MDF nie jest samodzielnym formatem wymiany, a narzędzia SQLite zwykle nie mogą otworzyć go bezpośrednio.

Czym jest format SQLITE

SQLite przechowuje całą relacyjną bazę danych w jednym pliku, zwykle używając rozszerzenia .sqlite, .sqlite3 lub .db. Aplikacje używają go do przechowywania danych lokalnie, wbudowanego oprogramowania, testowania, danych mobilnych, pracy offline oraz wymiany danych opartej na plikach.

SQLite nie wymaga serwera bazy danych i można go łatwo kopiować lub archiwizować. Jego system typów jest bardziej elastyczny niż system SQL Server, ale nie zapewnia bezpośrednich odpowiedników wszystkich funkcji SQL Server. Procedury składowane, zadania SQL Server Agent, serwery połączone, uprawnienia i wiele ustawień na poziomie serwera nie mogą zostać przeniesione do pliku SQLite.

Jak faktycznie przekonwertować MDF do SQLITE

1. Dołącz plik MDF do SQL Server

Zainstaluj zgodną edycję SQL Server, najlepiej Developer do zastosowań nieprodukcyjnych lub Express w przypadku lekkiej instancji lokalnej. W SQL Server Management Studio połącz się z instancją i wybierz Databases → Attach. Dodaj plik MDF i sprawdź wyświetloną ścieżkę do pliku dziennika.

Jeśli oryginalna baza danych została prawidłowo odłączona, jej plik LDF powinien znajdować się obok pliku MDF. Nie uruchamiaj poleceń naprawy ani odbudowy dziennika na jedynej kopii. Baza danych skopiowana podczas korzystania z niej przez SQL Server może być niespójna i zamiast tego należy ją odtworzyć z kopii zapasowej SQL Server.

2. Sprawdź schemat źródłowy

W SSMS sprawdź tabele, widoki, klucze, kolumny identity, kolumny obliczane, wyzwalacze, sortowania oraz nieobsługiwane typy charakterystyczne dla SQL Server. Zapytanie takie jak SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'; wyświetla tabele bazowe, które należy wyeksportować.

3. Eksportuj tabele za pomocą narzędzia obsługującego bazy danych

W przypadku powtarzalnej konwersji użyj języka Python wraz z pyodbc dla SQL Server oraz standardowego modułu sqlite3. Zainstaluj sterownik ODBC dla SQL Server i uruchom:

python -m pip install pyodbc

Poniższy przykład kopiuje jedną tabelę. Zastąp dane połączenia i nazwę tabeli, a następnie powtórz operację dla każdej wymaganej tabeli po utworzeniu schematu SQLite:

import sqlite3
import pyodbc

src = pyodbc.connect(
    "DRIVER={ODBC Driver 18 for SQL Server};"
    "SERVER=localhost;DATABASE=SourceDb;Trusted_Connection=yes;"
    "Encrypt=no;"
)
dst = sqlite3.connect("converted.sqlite")
source_table = "dbo.Customers"
target_table = "Customers"

cur = src.cursor()
cur.execute(f"SELECT * FROM {source_table}")
columns = [d[0] for d in cur.description]

def quote(name):
    return '"' + name.replace('"', '""') + '"'

def sqlite_type(value):
    if isinstance(value, (bytes, bytearray, memoryview)):
        return "BLOB"
    if isinstance(value, bool):
        return "INTEGER"
    if isinstance(value, int):
        return "INTEGER"
    if isinstance(value, float):
        return "REAL"
    return "TEXT"

first = cur.fetchone()
if first is not None:
    types = [sqlite_type(v) for v in first]
    dst.execute("CREATE TABLE " + quote(target_table) + " (" +
                ", ".join(quote(c) + " " + t for c, t in zip(columns, types)) + ")")
    placeholders = ",".join("?" for _ in columns)
    insert = "INSERT INTO " + quote(target_table) + " VALUES (" + placeholders + ")"
    dst.executemany(insert, [first] + cur.fetchall())

dst.commit()
src.close()
dst.close()

W przypadku pełnej migracji utwórz tabele jawnie na podstawie schematu SQL Server, zamiast wnioskować o typach na podstawie pierwszego wiersza. Eksportuj tabele nadrzędne przed tabelami podrzędnymi, wstaw wiersze, a następnie dodaj klucze obce i indeksy. Opcją graficzną jest DB Browser for SQLite po wyeksportowaniu każdej tabeli SQL Server do formatu CSV, ale CSV traci ograniczenia, dokładne typy, możliwość przechowywania wartości NULL oraz wartości binarne, dlatego lepiej sprawdza się w przypadku małych lub płaskich zbiorów danych.

4. Zweryfikuj wynikowy plik

Otwórz plik converted.sqlite w DB Browser for SQLite lub SQLiteStudio i porównaj liczbę wierszy za pomocą zapytań SQL Server i SQLite, takich jak SELECT COUNT(*) FROM Customers;. Wykonaj reprezentatywne złączenia, sprawdź daty i tekst Unicode oraz upewnij się, że klucze główne, indeksy i klucze obce zostały odtworzone.

Jakość, zgodność i ograniczenia

Kolumny SQL Server IDENTITY zwykle stają się kluczami całkowitymi SQLite, ale SQLite nie odtwarza zachowania automatycznego generowania wartości, chyba że schemat docelowy odpowiednio używa INTEGER PRIMARY KEY. Typy SQL Server UNIQUEIDENTIFIER, DECIMAL, XML, geography, hierarchyid, datetimeoffset i varbinary(max) wymagają przemyślanych mapowań; identyfikatory GUID można przechowywać jako tekst lub obiekty blob o rozmiarze 16 bajtów, a liczby dziesiętne o wysokiej precyzji nie powinny być konwertowane za pomocą binarnej reprezentacji zmiennoprzecinkowej.

Widoki i zapytania często wymagają przepisania SQL, ponieważ funkcje SQL Server, składnia nawiasów kwadratowych, funkcje daty i złączenia nie są w pełni zgodne z SQLite. Procedury składowane, wyzwalacze, indeksy pełnotekstowe, uprawnienia i automatyzacja po stronie serwera muszą zostać przeprojektowane lub pominięte. SQLite umożliwia również jednoczesny odczyt przez wielu użytkowników, ale ma inny sposób blokowania zapisu i obsługi transakcji, dlatego przekonwertowany plik nie jest bezpośrednim zamiennikiem wieloużytkownikowej bazy danych SQL Server.

Konwertery online zasadniczo nie nadają się do plików MDF, ponieważ potrzebują silnika SQL Server do dołączenia i zinterpretowania bazy danych, a przesłanie pliku MDF może ujawnić wszystkie zawarte w nim dane. Konwersję wykonuj lokalnie, chyba że baza danych została zanonimizowana, a dostawca ma jasną politykę bezpieczeństwa i przechowywania danych.

Porównanie formatu MDF z SQLITE

Jak formaty MDF i SQLITE wypadają w porównaniu pod względem najważniejszych cech dla tej konwersji.

Porównanie formatów plików MDF i SQLITE
Cecha .MDF Media Descriptor File .SQLITE SQLite database
Otwarty standard Nie Tak
Kompresja Oba Bez kompresji
Typowy rozmiar pliku Duży Mały
Otwiera się w przeglądarce internetowej Nie Nie
Dalsza edycja Nie do bezpośredniej edycji Ograniczone
Obsługa metadanych Podstawowy Podstawowy
Czytelny tekstowo Nie Nie
Najlepszy do Archiwizacja długoterminowa Wymiana danych
Wprowadzono 2000 2000
Twórca Alcohol Soft D. Richard Hipp / SQLite Consortium
Typ MIME — application/vnd.sqlite3

Dodatkowe formaty dla konwersji pliku
mdf

Konwersja odwrotna

Konwersja do .sqlite
z innych formatów

Udostępnij w mediach społecznościowych: