dbmigrate-pro 2.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dbmigrate_client/__init__.py +6 -0
- dbmigrate_client/cli.py +400 -0
- dbmigrate_pro-2.0.1.dist-info/METADATA +123 -0
- dbmigrate_pro-2.0.1.dist-info/RECORD +7 -0
- dbmigrate_pro-2.0.1.dist-info/WHEEL +4 -0
- dbmigrate_pro-2.0.1.dist-info/entry_points.txt +2 -0
- dbmigrate_pro-2.0.1.dist-info/licenses/LICENSE +151 -0
dbmigrate_client/cli.py
ADDED
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
"""
|
|
2
|
+
DBMigrate Pro - Thin Client
|
|
3
|
+
This CLI connects to the DBMigrate API. All migration logic runs on our servers.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
import json
|
|
9
|
+
import argparse
|
|
10
|
+
import requests
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Optional
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# API Configuration
|
|
17
|
+
API_BASE_URL = os.environ.get("DBMIGRATE_API_URL", "https://api.dbmigrate.io")
|
|
18
|
+
API_VERSION = "v1"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class ClientConfig:
|
|
23
|
+
"""Client configuration stored locally"""
|
|
24
|
+
api_key: Optional[str] = None
|
|
25
|
+
email: Optional[str] = None
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def load(cls) -> "ClientConfig":
|
|
29
|
+
config_file = Path.home() / ".dbmigrate" / "config.json"
|
|
30
|
+
if config_file.exists():
|
|
31
|
+
with open(config_file) as f:
|
|
32
|
+
data = json.load(f)
|
|
33
|
+
return cls(**data)
|
|
34
|
+
return cls()
|
|
35
|
+
|
|
36
|
+
def save(self):
|
|
37
|
+
config_dir = Path.home() / ".dbmigrate"
|
|
38
|
+
config_dir.mkdir(exist_ok=True)
|
|
39
|
+
config_file = config_dir / "config.json"
|
|
40
|
+
with open(config_file, "w") as f:
|
|
41
|
+
json.dump({"api_key": self.api_key, "email": self.email}, f)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class DBMigrateClient:
|
|
45
|
+
"""Client for DBMigrate API"""
|
|
46
|
+
|
|
47
|
+
def __init__(self):
|
|
48
|
+
self.config = ClientConfig.load()
|
|
49
|
+
self.session = requests.Session()
|
|
50
|
+
if self.config.api_key:
|
|
51
|
+
self.session.headers["Authorization"] = f"Bearer {self.config.api_key}"
|
|
52
|
+
self.session.headers["Content-Type"] = "application/json"
|
|
53
|
+
self.session.headers["User-Agent"] = "dbmigrate-pro-cli/1.0"
|
|
54
|
+
|
|
55
|
+
def _api_url(self, endpoint: str) -> str:
|
|
56
|
+
return f"{API_BASE_URL}/{API_VERSION}/{endpoint}"
|
|
57
|
+
|
|
58
|
+
def _handle_response(self, response: requests.Response) -> dict:
|
|
59
|
+
"""Handle API response and errors"""
|
|
60
|
+
if response.status_code == 401:
|
|
61
|
+
print("ā Authentication required. Run: dbmigrate login")
|
|
62
|
+
sys.exit(1)
|
|
63
|
+
elif response.status_code == 402:
|
|
64
|
+
data = response.json()
|
|
65
|
+
print(f"ā {data.get('error', 'Payment required')}")
|
|
66
|
+
print(f" Current plan: {data.get('plan', 'Free')}")
|
|
67
|
+
print(f" Usage: {data.get('used', 0)}/{data.get('limit', 0)} tables this month")
|
|
68
|
+
print(f"\nš” Upgrade at https://dbmigrate.io/pricing")
|
|
69
|
+
sys.exit(1)
|
|
70
|
+
elif response.status_code == 429:
|
|
71
|
+
print("ā Rate limit exceeded. Please wait and try again.")
|
|
72
|
+
sys.exit(1)
|
|
73
|
+
elif response.status_code >= 400:
|
|
74
|
+
error = response.json().get("error", "Unknown error")
|
|
75
|
+
print(f"ā Error: {error}")
|
|
76
|
+
sys.exit(1)
|
|
77
|
+
|
|
78
|
+
return response.json()
|
|
79
|
+
|
|
80
|
+
def login(self, email: str, password: str) -> dict:
|
|
81
|
+
"""Login and get API key"""
|
|
82
|
+
response = self.session.post(
|
|
83
|
+
self._api_url("auth/login"),
|
|
84
|
+
json={"email": email, "password": password}
|
|
85
|
+
)
|
|
86
|
+
data = self._handle_response(response)
|
|
87
|
+
|
|
88
|
+
# Save credentials
|
|
89
|
+
self.config.api_key = data["api_key"]
|
|
90
|
+
self.config.email = email
|
|
91
|
+
self.config.save()
|
|
92
|
+
|
|
93
|
+
return data
|
|
94
|
+
|
|
95
|
+
def signup(self, email: str, password: str) -> dict:
|
|
96
|
+
"""Create new account"""
|
|
97
|
+
response = self.session.post(
|
|
98
|
+
self._api_url("auth/signup"),
|
|
99
|
+
json={"email": email, "password": password}
|
|
100
|
+
)
|
|
101
|
+
return self._handle_response(response)
|
|
102
|
+
|
|
103
|
+
def status(self) -> dict:
|
|
104
|
+
"""Get account status and usage"""
|
|
105
|
+
response = self.session.get(self._api_url("account/status"))
|
|
106
|
+
return self._handle_response(response)
|
|
107
|
+
|
|
108
|
+
def migrate(
|
|
109
|
+
self,
|
|
110
|
+
source_type: str,
|
|
111
|
+
target_type: str,
|
|
112
|
+
source_connection: str,
|
|
113
|
+
target_connection: Optional[str] = None,
|
|
114
|
+
include_tables: Optional[list] = None,
|
|
115
|
+
exclude_tables: Optional[list] = None,
|
|
116
|
+
include_data: bool = True,
|
|
117
|
+
include_procedures: bool = True,
|
|
118
|
+
) -> dict:
|
|
119
|
+
"""
|
|
120
|
+
Run a migration via the API.
|
|
121
|
+
|
|
122
|
+
The actual migration runs on our servers. Connection strings are
|
|
123
|
+
encrypted and never stored.
|
|
124
|
+
"""
|
|
125
|
+
payload = {
|
|
126
|
+
"source_type": source_type,
|
|
127
|
+
"target_type": target_type,
|
|
128
|
+
"source_connection": source_connection,
|
|
129
|
+
"target_connection": target_connection,
|
|
130
|
+
"options": {
|
|
131
|
+
"include_tables": include_tables,
|
|
132
|
+
"exclude_tables": exclude_tables,
|
|
133
|
+
"include_data": include_data,
|
|
134
|
+
"include_procedures": include_procedures,
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
print("š Connecting to DBMigrate API...")
|
|
139
|
+
response = self.session.post(
|
|
140
|
+
self._api_url("migrations"),
|
|
141
|
+
json=payload,
|
|
142
|
+
timeout=300 # 5 minute timeout for large migrations
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return self._handle_response(response)
|
|
146
|
+
|
|
147
|
+
def get_migration(self, migration_id: str) -> dict:
|
|
148
|
+
"""Get migration status"""
|
|
149
|
+
response = self.session.get(self._api_url(f"migrations/{migration_id}"))
|
|
150
|
+
return self._handle_response(response)
|
|
151
|
+
|
|
152
|
+
def download_result(self, migration_id: str, output_dir: str) -> str:
|
|
153
|
+
"""Download migration results"""
|
|
154
|
+
response = self.session.get(
|
|
155
|
+
self._api_url(f"migrations/{migration_id}/download"),
|
|
156
|
+
stream=True
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
if response.status_code != 200:
|
|
160
|
+
self._handle_response(response)
|
|
161
|
+
|
|
162
|
+
output_path = Path(output_dir)
|
|
163
|
+
output_path.mkdir(parents=True, exist_ok=True)
|
|
164
|
+
|
|
165
|
+
zip_file = output_path / f"migration_{migration_id}.zip"
|
|
166
|
+
with open(zip_file, "wb") as f:
|
|
167
|
+
for chunk in response.iter_content(chunk_size=8192):
|
|
168
|
+
f.write(chunk)
|
|
169
|
+
|
|
170
|
+
return str(zip_file)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# CLI Commands
|
|
174
|
+
|
|
175
|
+
def cmd_login(args):
|
|
176
|
+
"""Login to DBMigrate"""
|
|
177
|
+
import getpass
|
|
178
|
+
|
|
179
|
+
email = args.email or input("Email: ")
|
|
180
|
+
password = getpass.getpass("Password: ")
|
|
181
|
+
|
|
182
|
+
client = DBMigrateClient()
|
|
183
|
+
result = client.login(email, password)
|
|
184
|
+
|
|
185
|
+
print("=" * 60)
|
|
186
|
+
print("ā
Logged in successfully!")
|
|
187
|
+
print("=" * 60)
|
|
188
|
+
print(f" Email: {email}")
|
|
189
|
+
print(f" Plan: {result.get('plan', 'Free')}")
|
|
190
|
+
print(f" Tables remaining: {result.get('tables_remaining', 1)}")
|
|
191
|
+
print("=" * 60)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def cmd_signup(args):
|
|
195
|
+
"""Create a new account"""
|
|
196
|
+
import getpass
|
|
197
|
+
|
|
198
|
+
email = args.email or input("Email: ")
|
|
199
|
+
password = getpass.getpass("Password: ")
|
|
200
|
+
confirm = getpass.getpass("Confirm password: ")
|
|
201
|
+
|
|
202
|
+
if password != confirm:
|
|
203
|
+
print("ā Passwords don't match")
|
|
204
|
+
sys.exit(1)
|
|
205
|
+
|
|
206
|
+
client = DBMigrateClient()
|
|
207
|
+
result = client.signup(email, password)
|
|
208
|
+
|
|
209
|
+
print("=" * 60)
|
|
210
|
+
print("š Account created!")
|
|
211
|
+
print("=" * 60)
|
|
212
|
+
print(f" Email: {email}")
|
|
213
|
+
print(f" Plan: Free (1 table to test)")
|
|
214
|
+
print()
|
|
215
|
+
print(" Now run: dbmigrate login")
|
|
216
|
+
print("=" * 60)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def cmd_status(args):
|
|
220
|
+
"""Show account status"""
|
|
221
|
+
client = DBMigrateClient()
|
|
222
|
+
result = client.status()
|
|
223
|
+
|
|
224
|
+
plan = result.get("plan", "Free")
|
|
225
|
+
tables_used = result.get("tables_used", 0)
|
|
226
|
+
tables_limit = result.get("tables_limit", 1)
|
|
227
|
+
sp_used = result.get("sp_used", 0)
|
|
228
|
+
sp_limit = result.get("sp_limit", 0)
|
|
229
|
+
|
|
230
|
+
print("=" * 60)
|
|
231
|
+
print("DBMigrate Pro - Account Status")
|
|
232
|
+
print("=" * 60)
|
|
233
|
+
print(f" Email: {result.get('email', 'Not logged in')}")
|
|
234
|
+
print(f" Plan: {plan.upper()}")
|
|
235
|
+
print()
|
|
236
|
+
print("Usage This Month:")
|
|
237
|
+
print(f" Tables: {tables_used}/{tables_limit}")
|
|
238
|
+
print(f" Stored Procedures: {sp_used}/{sp_limit}")
|
|
239
|
+
|
|
240
|
+
if result.get("expires_at"):
|
|
241
|
+
print(f" Renews: {result['expires_at']}")
|
|
242
|
+
|
|
243
|
+
print("=" * 60)
|
|
244
|
+
|
|
245
|
+
if plan.lower() == "free":
|
|
246
|
+
print()
|
|
247
|
+
print("š¦ Upgrade for more migrations:")
|
|
248
|
+
print(" Starter ($99/mo): 50 tables, 20 SPs")
|
|
249
|
+
print(" Pro ($499/mo): 500 tables, 200 SPs")
|
|
250
|
+
print(" Enterprise ($2,499): Unlimited")
|
|
251
|
+
print()
|
|
252
|
+
print(" š https://dbmigrate.io/pricing")
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def cmd_migrate(args):
|
|
256
|
+
"""Run a migration"""
|
|
257
|
+
client = DBMigrateClient()
|
|
258
|
+
|
|
259
|
+
# Parse table lists
|
|
260
|
+
include_tables = args.include_tables.split(",") if args.include_tables else None
|
|
261
|
+
exclude_tables = args.exclude_tables.split(",") if args.exclude_tables else None
|
|
262
|
+
|
|
263
|
+
print("=" * 60)
|
|
264
|
+
print("DBMigrate Pro - Universal Database Migration")
|
|
265
|
+
print("=" * 60)
|
|
266
|
+
print(f"Source: {args.source}")
|
|
267
|
+
print(f"Target: {args.target}")
|
|
268
|
+
print("=" * 60)
|
|
269
|
+
print()
|
|
270
|
+
|
|
271
|
+
# Start migration
|
|
272
|
+
result = client.migrate(
|
|
273
|
+
source_type=args.source,
|
|
274
|
+
target_type=args.target,
|
|
275
|
+
source_connection=args.source_conn,
|
|
276
|
+
target_connection=args.target_conn,
|
|
277
|
+
include_tables=include_tables,
|
|
278
|
+
exclude_tables=exclude_tables,
|
|
279
|
+
include_data=not args.no_data,
|
|
280
|
+
include_procedures=not args.no_procedures,
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
migration_id = result.get("migration_id")
|
|
284
|
+
status = result.get("status")
|
|
285
|
+
|
|
286
|
+
if status == "completed":
|
|
287
|
+
print("ā
Migration completed!")
|
|
288
|
+
print()
|
|
289
|
+
print(f" Tables migrated: {result.get('tables_migrated', 0)}")
|
|
290
|
+
print(f" SPs converted: {result.get('sp_converted', 0)}")
|
|
291
|
+
print(f" Duration: {result.get('duration', 'N/A')}")
|
|
292
|
+
|
|
293
|
+
# Download results
|
|
294
|
+
if args.output:
|
|
295
|
+
print()
|
|
296
|
+
print("š„ Downloading results...")
|
|
297
|
+
zip_file = client.download_result(migration_id, args.output)
|
|
298
|
+
print(f" Saved to: {zip_file}")
|
|
299
|
+
|
|
300
|
+
elif status == "processing":
|
|
301
|
+
print("ā³ Migration is processing...")
|
|
302
|
+
print(f" Migration ID: {migration_id}")
|
|
303
|
+
print()
|
|
304
|
+
print(" Check status: dbmigrate status --migration {migration_id}")
|
|
305
|
+
|
|
306
|
+
else:
|
|
307
|
+
print(f"ā Migration failed: {result.get('error', 'Unknown error')}")
|
|
308
|
+
sys.exit(1)
|
|
309
|
+
|
|
310
|
+
print("=" * 60)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def cmd_logout(args):
|
|
314
|
+
"""Logout and clear credentials"""
|
|
315
|
+
config = ClientConfig()
|
|
316
|
+
config.api_key = None
|
|
317
|
+
config.email = None
|
|
318
|
+
config.save()
|
|
319
|
+
print("ā
Logged out successfully")
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def main():
|
|
323
|
+
"""Main CLI entry point"""
|
|
324
|
+
parser = argparse.ArgumentParser(
|
|
325
|
+
prog="dbmigrate",
|
|
326
|
+
description="DBMigrate Pro - Universal Database Migration Tool",
|
|
327
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
328
|
+
epilog="""
|
|
329
|
+
Pricing:
|
|
330
|
+
Free: 1 table (test before you buy)
|
|
331
|
+
Starter: 50 tables/mo, 20 SPs $99/mo
|
|
332
|
+
Pro: 500 tables/mo, 200 SPs $499/mo
|
|
333
|
+
Enterprise: Unlimited $2,499/mo
|
|
334
|
+
|
|
335
|
+
Examples:
|
|
336
|
+
# Create account and login
|
|
337
|
+
dbmigrate signup
|
|
338
|
+
dbmigrate login
|
|
339
|
+
|
|
340
|
+
# Check your usage
|
|
341
|
+
dbmigrate status
|
|
342
|
+
|
|
343
|
+
# Run a migration
|
|
344
|
+
dbmigrate migrate -s postgresql -t mysql \\
|
|
345
|
+
--source-conn "postgresql://user:pass@host/db" \\
|
|
346
|
+
--output ./results
|
|
347
|
+
|
|
348
|
+
Supported: PostgreSQL, MySQL, Oracle, SQL Server, MongoDB,
|
|
349
|
+
Neo4j, Redis, Pinecone, ClickHouse, and 65+ more
|
|
350
|
+
|
|
351
|
+
Website: https://dbmigrate.io
|
|
352
|
+
"""
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
subparsers = parser.add_subparsers(dest="command", help="Commands")
|
|
356
|
+
|
|
357
|
+
# Signup
|
|
358
|
+
signup_parser = subparsers.add_parser("signup", help="Create a new account")
|
|
359
|
+
signup_parser.add_argument("--email", "-e", help="Email address")
|
|
360
|
+
|
|
361
|
+
# Login
|
|
362
|
+
login_parser = subparsers.add_parser("login", help="Login to your account")
|
|
363
|
+
login_parser.add_argument("--email", "-e", help="Email address")
|
|
364
|
+
|
|
365
|
+
# Logout
|
|
366
|
+
subparsers.add_parser("logout", help="Logout and clear credentials")
|
|
367
|
+
|
|
368
|
+
# Status
|
|
369
|
+
subparsers.add_parser("status", help="Show account status and usage")
|
|
370
|
+
|
|
371
|
+
# Migrate
|
|
372
|
+
migrate_parser = subparsers.add_parser("migrate", help="Run a database migration")
|
|
373
|
+
migrate_parser.add_argument("--source", "-s", required=True, help="Source database type")
|
|
374
|
+
migrate_parser.add_argument("--target", "-t", required=True, help="Target database type")
|
|
375
|
+
migrate_parser.add_argument("--source-conn", "-c", required=True, help="Source connection string")
|
|
376
|
+
migrate_parser.add_argument("--target-conn", help="Target connection string (optional)")
|
|
377
|
+
migrate_parser.add_argument("--output", "-o", help="Output directory for results")
|
|
378
|
+
migrate_parser.add_argument("--include-tables", help="Tables to include (comma-separated)")
|
|
379
|
+
migrate_parser.add_argument("--exclude-tables", help="Tables to exclude (comma-separated)")
|
|
380
|
+
migrate_parser.add_argument("--no-data", action="store_true", help="Skip data migration")
|
|
381
|
+
migrate_parser.add_argument("--no-procedures", action="store_true", help="Skip SP conversion")
|
|
382
|
+
|
|
383
|
+
args = parser.parse_args()
|
|
384
|
+
|
|
385
|
+
if args.command == "signup":
|
|
386
|
+
cmd_signup(args)
|
|
387
|
+
elif args.command == "login":
|
|
388
|
+
cmd_login(args)
|
|
389
|
+
elif args.command == "logout":
|
|
390
|
+
cmd_logout(args)
|
|
391
|
+
elif args.command == "status":
|
|
392
|
+
cmd_status(args)
|
|
393
|
+
elif args.command == "migrate":
|
|
394
|
+
cmd_migrate(args)
|
|
395
|
+
else:
|
|
396
|
+
parser.print_help()
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
if __name__ == "__main__":
|
|
400
|
+
main()
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dbmigrate-pro
|
|
3
|
+
Version: 2.0.1
|
|
4
|
+
Summary: [COMING SOON] Universal Database Migration Tool - Migrate any database to any database (74+ databases supported)
|
|
5
|
+
Project-URL: Homepage, https://dbmigrate.io
|
|
6
|
+
Project-URL: Documentation, https://docs.dbmigrate.io
|
|
7
|
+
Project-URL: Pricing, https://dbmigrate.io/pricing
|
|
8
|
+
Project-URL: Support, https://dbmigrate.io/support
|
|
9
|
+
Author-email: "DBMigrate Inc." <hello@dbmigrate.io>
|
|
10
|
+
License: Proprietary - https://dbmigrate.io/terms
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: data-migration,database,etl,migration,mongodb,mysql,oracle,postgresql,schema,sql,stored-procedures
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: System Administrators
|
|
16
|
+
Classifier: License :: Other/Proprietary License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Topic :: Database
|
|
25
|
+
Requires-Python: >=3.8
|
|
26
|
+
Requires-Dist: requests>=2.28.0
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# DBMigrate Pro
|
|
30
|
+
|
|
31
|
+
**Universal Database Migration Tool** - Migrate any database to any database.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## ā ļø COMING SOON - NOT LIVE YET
|
|
36
|
+
|
|
37
|
+
**This package is currently in pre-release.** The API is not yet available.
|
|
38
|
+
|
|
39
|
+
š **Launch Date:** January 29, 2026
|
|
40
|
+
|
|
41
|
+
š§ **Get notified:** Email hello@dbmigrate.io to join the waitlist.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## š Quick Start (Available Soon)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Install
|
|
49
|
+
pip install dbmigrate-pro
|
|
50
|
+
|
|
51
|
+
# Create free account (1 table free to test)
|
|
52
|
+
dbmigrate signup
|
|
53
|
+
|
|
54
|
+
# Login
|
|
55
|
+
dbmigrate login
|
|
56
|
+
|
|
57
|
+
# Run migration
|
|
58
|
+
dbmigrate migrate \
|
|
59
|
+
--source postgresql \
|
|
60
|
+
--target mysql \
|
|
61
|
+
--source-conn "postgresql://user:pass@localhost/mydb" \
|
|
62
|
+
--output ./results
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## š° Pricing
|
|
66
|
+
|
|
67
|
+
| Plan | Tables/Month | SP Conversions | Price |
|
|
68
|
+
|------|-------------|----------------|-------|
|
|
69
|
+
| **Free** | 1 | 0 | $0 (test before you buy) |
|
|
70
|
+
| **Starter** | 50 | 20 | $99/mo |
|
|
71
|
+
| **Pro** | 500 | 200 | $499/mo |
|
|
72
|
+
| **Enterprise** | Unlimited | Unlimited | $2,499/mo |
|
|
73
|
+
|
|
74
|
+
š **Upgrade at [dbmigrate.io/pricing](https://dbmigrate.io/pricing)**
|
|
75
|
+
|
|
76
|
+
## šļø Supported Databases (74+)
|
|
77
|
+
|
|
78
|
+
### Relational
|
|
79
|
+
PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, SQLite, DB2, Snowflake, BigQuery, Redshift, Azure SQL, AWS RDS
|
|
80
|
+
|
|
81
|
+
### Document
|
|
82
|
+
MongoDB, Couchbase, CouchDB, Amazon DocumentDB, Azure Cosmos DB, Firebase Firestore
|
|
83
|
+
|
|
84
|
+
### Graph
|
|
85
|
+
Neo4j, Amazon Neptune, ArangoDB, JanusGraph, TigerGraph, Dgraph
|
|
86
|
+
|
|
87
|
+
### Vector
|
|
88
|
+
Pinecone, Milvus, Weaviate, Qdrant, Chroma, pgvector
|
|
89
|
+
|
|
90
|
+
### Time-Series
|
|
91
|
+
InfluxDB, TimescaleDB, QuestDB, Prometheus, VictoriaMetrics
|
|
92
|
+
|
|
93
|
+
### Key-Value & Columnar
|
|
94
|
+
Redis, DynamoDB, Cassandra, ClickHouse, Elasticsearch
|
|
95
|
+
|
|
96
|
+
## š Commands
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Account
|
|
100
|
+
dbmigrate signup # Create account
|
|
101
|
+
dbmigrate login # Login
|
|
102
|
+
dbmigrate status # Check usage
|
|
103
|
+
dbmigrate logout # Logout
|
|
104
|
+
|
|
105
|
+
# Migration
|
|
106
|
+
dbmigrate migrate -s SOURCE -t TARGET -c CONNECTION
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## š Security
|
|
110
|
+
|
|
111
|
+
- All migrations run on our secure servers
|
|
112
|
+
- Connection strings are encrypted in transit and never stored
|
|
113
|
+
- SOC 2 Type II compliant infrastructure
|
|
114
|
+
- GDPR/HIPAA data handling available (Enterprise)
|
|
115
|
+
|
|
116
|
+
## š Support
|
|
117
|
+
|
|
118
|
+
- **Free/Starter**: Email support (48hr response)
|
|
119
|
+
- **Pro**: Priority support (24hr response)
|
|
120
|
+
- **Enterprise**: Dedicated engineer, Slack channel
|
|
121
|
+
|
|
122
|
+
Website: https://dbmigrate.io
|
|
123
|
+
Email: support@dbmigrate.io
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
dbmigrate_client/__init__.py,sha256=fjUIQ4PjY8MJ6NB_Ja2KfUlWEInwpqfApVxKt7uCSrk,163
|
|
2
|
+
dbmigrate_client/cli.py,sha256=EdMX-BAgXziscWgz4KZZWKlezifSKuEkj6H-NwdHgyI,13409
|
|
3
|
+
dbmigrate_pro-2.0.1.dist-info/METADATA,sha256=PkqIitTOfuUPsNFJ_SjbYFlLgM_wF38Erz9o6_GGhPE,3583
|
|
4
|
+
dbmigrate_pro-2.0.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
5
|
+
dbmigrate_pro-2.0.1.dist-info/entry_points.txt,sha256=UjNq4HKY8Bxzn3JuNHWH_2HKYaaII61VDYnkc6e5dE8,52
|
|
6
|
+
dbmigrate_pro-2.0.1.dist-info/licenses/LICENSE,sha256=eKdi7-5Y4hsYWTb2dj7pMXq2RhePNsPMnH8PQrzHG3I,5716
|
|
7
|
+
dbmigrate_pro-2.0.1.dist-info/RECORD,,
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
DBMigrate Commercial License Agreement
|
|
2
|
+
Version 1.0, January 2026
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2026 DBMigrate Inc.
|
|
5
|
+
All Rights Reserved.
|
|
6
|
+
|
|
7
|
+
================================================================================
|
|
8
|
+
COMMERCIAL LICENSE
|
|
9
|
+
================================================================================
|
|
10
|
+
|
|
11
|
+
This license agreement ("Agreement") is between DBMigrate Inc. ("Company") and
|
|
12
|
+
the individual or entity ("Licensee") who has purchased a license to use
|
|
13
|
+
DBMigrate ("Software").
|
|
14
|
+
|
|
15
|
+
1. GRANT OF LICENSE
|
|
16
|
+
-------------------
|
|
17
|
+
Subject to payment of the applicable license fees and compliance with this
|
|
18
|
+
Agreement, Company grants Licensee a non-exclusive, non-transferable license to:
|
|
19
|
+
|
|
20
|
+
a) Install and use the Software for internal business purposes
|
|
21
|
+
b) Use the Software to perform database migrations as described in the
|
|
22
|
+
documentation
|
|
23
|
+
c) Access updates and support according to the purchased plan
|
|
24
|
+
|
|
25
|
+
2. LICENSE TIERS
|
|
26
|
+
----------------
|
|
27
|
+
The Software is available under the following tiers:
|
|
28
|
+
|
|
29
|
+
STARTER ($299/month) - For individuals and small teams:
|
|
30
|
+
- Teams of 1-5 users
|
|
31
|
+
- Up to 100 tables per month
|
|
32
|
+
- Up to 50 stored procedure conversions
|
|
33
|
+
- Up to 5 database connections
|
|
34
|
+
- Single paradigm migrations only
|
|
35
|
+
- Email support (48-hour response)
|
|
36
|
+
- Best for: Small projects, startups, single migrations
|
|
37
|
+
|
|
38
|
+
PROFESSIONAL ($899/month) - For growing companies:
|
|
39
|
+
- Teams of 6-20 users
|
|
40
|
+
- Up to 500 tables per month
|
|
41
|
+
- Up to 250 stored procedure conversions
|
|
42
|
+
- Up to 20 database connections
|
|
43
|
+
- Cross-paradigm transformations included
|
|
44
|
+
- Priority support (24-hour response)
|
|
45
|
+
- Best for: Mid-size companies, multiple projects, ongoing migrations
|
|
46
|
+
|
|
47
|
+
BUSINESS ($2,499/month) - For enterprise teams:
|
|
48
|
+
- Teams of 21-100 users
|
|
49
|
+
- Up to 2,500 tables per month
|
|
50
|
+
- Up to 1,500 stored procedure conversions
|
|
51
|
+
- Unlimited database connections
|
|
52
|
+
- Data masking (GDPR/HIPAA/PCI-DSS compliant)
|
|
53
|
+
- WebSocket real-time API
|
|
54
|
+
- Parallel processing (multi-threaded)
|
|
55
|
+
- Premium support (8-hour response)
|
|
56
|
+
- Best for: Large enterprises, mission-critical migrations, compliance needs
|
|
57
|
+
|
|
58
|
+
ENTERPRISE ($7,500+/month) - For large organizations:
|
|
59
|
+
- Unlimited users
|
|
60
|
+
- Unlimited tables per month
|
|
61
|
+
- Unlimited stored procedure conversions
|
|
62
|
+
- Unlimited database connections
|
|
63
|
+
- All Business features, plus:
|
|
64
|
+
- Distributed horizontal scaling (Redis-based)
|
|
65
|
+
- Dedicated support engineer
|
|
66
|
+
- Custom SLA (up to 99.99% uptime)
|
|
67
|
+
- On-premise deployment option
|
|
68
|
+
- Custom integrations and training
|
|
69
|
+
- 24/7 support (1-hour response)
|
|
70
|
+
- Best for: Fortune 500, multi-region deployments, regulated industries
|
|
71
|
+
|
|
72
|
+
TIER SELECTION CRITERIA:
|
|
73
|
+
- Team Size: Number of users accessing the system
|
|
74
|
+
- Migration Volume: Tables and procedures converted per month
|
|
75
|
+
- Connections: Concurrent database connections needed
|
|
76
|
+
- Features: Cross-paradigm, masking, parallel processing needs
|
|
77
|
+
- Support: Response time and dedicated support requirements
|
|
78
|
+
|
|
79
|
+
3. RESTRICTIONS
|
|
80
|
+
---------------
|
|
81
|
+
Licensee shall NOT:
|
|
82
|
+
|
|
83
|
+
a) Redistribute, sublicense, rent, lease, or lend the Software
|
|
84
|
+
b) Modify, reverse engineer, decompile, or disassemble the Software
|
|
85
|
+
c) Remove or alter any proprietary notices
|
|
86
|
+
d) Use the Software to create a competing product
|
|
87
|
+
e) Exceed the usage limits of the purchased tier
|
|
88
|
+
|
|
89
|
+
4. FREE TIER / EVALUATION
|
|
90
|
+
-------------------------
|
|
91
|
+
The Software may be used FREE for:
|
|
92
|
+
|
|
93
|
+
a) Evaluation and testing purposes (14-day trial)
|
|
94
|
+
b) Personal, non-commercial projects
|
|
95
|
+
c) Open-source projects (with attribution)
|
|
96
|
+
d) Educational and academic use
|
|
97
|
+
|
|
98
|
+
5. INTELLECTUAL PROPERTY
|
|
99
|
+
------------------------
|
|
100
|
+
The Software and all copies thereof are proprietary to Company and title
|
|
101
|
+
remains with Company. All rights not specifically granted are reserved.
|
|
102
|
+
|
|
103
|
+
6. SUPPORT AND UPDATES
|
|
104
|
+
----------------------
|
|
105
|
+
Support and updates are provided according to the purchased tier:
|
|
106
|
+
|
|
107
|
+
- Starter: Email support (48-hour response)
|
|
108
|
+
- Professional: Priority support (24-hour response)
|
|
109
|
+
- Business: Premium support (8-hour response)
|
|
110
|
+
- Enterprise: Dedicated support (1-hour response, 24/7)
|
|
111
|
+
|
|
112
|
+
7. WARRANTY DISCLAIMER
|
|
113
|
+
----------------------
|
|
114
|
+
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
115
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
116
|
+
FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT.
|
|
117
|
+
|
|
118
|
+
8. LIMITATION OF LIABILITY
|
|
119
|
+
--------------------------
|
|
120
|
+
IN NO EVENT SHALL COMPANY BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
|
|
121
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THE SOFTWARE.
|
|
122
|
+
|
|
123
|
+
Company's total liability shall not exceed the amounts paid by Licensee in
|
|
124
|
+
the twelve (12) months preceding the claim.
|
|
125
|
+
|
|
126
|
+
9. TERMINATION
|
|
127
|
+
--------------
|
|
128
|
+
This Agreement terminates automatically if Licensee fails to comply with its
|
|
129
|
+
terms. Upon termination, Licensee must cease all use and destroy all copies
|
|
130
|
+
of the Software.
|
|
131
|
+
|
|
132
|
+
10. GOVERNING LAW
|
|
133
|
+
-----------------
|
|
134
|
+
This Agreement shall be governed by the laws of the State of Delaware, USA.
|
|
135
|
+
|
|
136
|
+
================================================================================
|
|
137
|
+
CONTACT INFORMATION
|
|
138
|
+
================================================================================
|
|
139
|
+
|
|
140
|
+
DBMigrate Inc.
|
|
141
|
+
Email: legal@dbmigrate.io
|
|
142
|
+
Sales: sales@dbmigrate.io
|
|
143
|
+
Support: support@dbmigrate.io
|
|
144
|
+
|
|
145
|
+
Website: https://dbmigrate.io
|
|
146
|
+
Documentation: https://docs.dbmigrate.io
|
|
147
|
+
|
|
148
|
+
================================================================================
|
|
149
|
+
|
|
150
|
+
By installing or using the Software, you acknowledge that you have read this
|
|
151
|
+
Agreement, understand it, and agree to be bound by its terms.
|