|
21 | 21 | from mysql_to_sqlite3.mysql_utils import CHARSET_INTRODUCERS
|
22 | 22 | from mysql_to_sqlite3.sqlite_utils import (
|
23 | 23 | CollatingSequences,
|
| 24 | + Integer_Types, |
24 | 25 | adapt_decimal,
|
25 | 26 | adapt_timedelta,
|
26 | 27 | convert_date,
|
@@ -384,24 +385,42 @@ def _build_create_table_sql(self, table_name: str) -> str:
|
384 | 385 | column_type=row["Type"], # type: ignore[arg-type]
|
385 | 386 | sqlite_json1_extension_enabled=self._sqlite_json1_extension_enabled,
|
386 | 387 | )
|
387 |
| - sql += '\n\t"{name}" {type} {notnull} {default} {collation},'.format( |
388 |
| - name=row["Field"].decode() if isinstance(row["Field"], bytes) else row["Field"], |
389 |
| - type=column_type, |
390 |
| - notnull="NULL" if row["Null"] == "YES" else "NOT NULL", |
391 |
| - default=self._translate_default_from_mysql_to_sqlite(row["Default"], column_type, row["Extra"]), |
392 |
| - collation=self._data_type_collation_sequence(self._collation, column_type), |
393 |
| - ) |
| 388 | + if row["Key"] == "PRI" and row["Extra"] == "auto_increment": |
| 389 | + if column_type in Integer_Types: |
| 390 | + sql += '\n\t"{name}" INTEGER PRIMARY KEY AUTOINCREMENT,'.format( |
| 391 | + name=row["Field"].decode() if isinstance(row["Field"], bytes) else row["Field"], |
| 392 | + ) |
| 393 | + else: |
| 394 | + self._logger.warning( |
| 395 | + 'Primary key "%s" in table "%s" is not an INTEGER type! Skipping.', |
| 396 | + row["Field"], |
| 397 | + table_name, |
| 398 | + ) |
| 399 | + else: |
| 400 | + sql += '\n\t"{name}" {type} {notnull} {default} {collation},'.format( |
| 401 | + name=row["Field"].decode() if isinstance(row["Field"], bytes) else row["Field"], |
| 402 | + type=column_type, |
| 403 | + notnull="NULL" if row["Null"] == "YES" else "NOT NULL", |
| 404 | + default=self._translate_default_from_mysql_to_sqlite(row["Default"], column_type, row["Extra"]), |
| 405 | + collation=self._data_type_collation_sequence(self._collation, column_type), |
| 406 | + ) |
394 | 407 |
|
395 | 408 | self._mysql_cur_dict.execute(
|
396 | 409 | """
|
397 |
| - SELECT INDEX_NAME AS `name`, |
398 |
| - IF (NON_UNIQUE = 0 AND INDEX_NAME = 'PRIMARY', 1, 0) AS `primary`, |
399 |
| - IF (NON_UNIQUE = 0 AND INDEX_NAME <> 'PRIMARY', 1, 0) AS `unique`, |
400 |
| - GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS `columns` |
401 |
| - FROM information_schema.STATISTICS |
402 |
| - WHERE TABLE_SCHEMA = %s |
403 |
| - AND TABLE_NAME = %s |
404 |
| - GROUP BY INDEX_NAME, NON_UNIQUE |
| 410 | + SELECT s.INDEX_NAME AS `name`, |
| 411 | + IF (NON_UNIQUE = 0 AND s.INDEX_NAME = 'PRIMARY', 1, 0) AS `primary`, |
| 412 | + IF (NON_UNIQUE = 0 AND s.INDEX_NAME <> 'PRIMARY', 1, 0) AS `unique`, |
| 413 | + IF (c.EXTRA = 'auto_increment', 1, 0) AS `auto_increment`, |
| 414 | + GROUP_CONCAT(s.COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS `columns`, |
| 415 | + GROUP_CONCAT(c.COLUMN_TYPE ORDER BY SEQ_IN_INDEX) AS `types` |
| 416 | + FROM information_schema.STATISTICS AS s |
| 417 | + JOIN information_schema.COLUMNS AS c |
| 418 | + ON s.TABLE_SCHEMA = c.TABLE_SCHEMA |
| 419 | + AND s.TABLE_NAME = c.TABLE_NAME |
| 420 | + AND s.COLUMN_NAME = c.COLUMN_NAME |
| 421 | + WHERE s.TABLE_SCHEMA = %s |
| 422 | + AND s.TABLE_NAME = %s |
| 423 | + GROUP BY s.INDEX_NAME, s.NON_UNIQUE, c.EXTRA |
405 | 424 | """,
|
406 | 425 | (self._mysql_database, table_name),
|
407 | 426 | )
|
@@ -437,17 +456,33 @@ def _build_create_table_sql(self, table_name: str) -> str:
|
437 | 456 | elif isinstance(index["columns"], str):
|
438 | 457 | columns = index["columns"]
|
439 | 458 |
|
| 459 | + types: str = "" |
| 460 | + if isinstance(index["types"], bytes): |
| 461 | + types = index["types"].decode() |
| 462 | + elif isinstance(index["types"], str): |
| 463 | + types = index["types"] |
| 464 | + |
440 | 465 | if len(columns) > 0:
|
441 | 466 | if index["primary"] in {1, "1"}:
|
442 |
| - primary += "\n\tPRIMARY KEY ({})".format( |
443 |
| - ", ".join(f'"{column}"' for column in columns.split(",")) |
444 |
| - ) |
| 467 | + if (index["auto_increment"] not in {1, "1"}) or any( |
| 468 | + self._translate_type_from_mysql_to_sqlite( |
| 469 | + column_type=_type, |
| 470 | + sqlite_json1_extension_enabled=self._sqlite_json1_extension_enabled, |
| 471 | + ) |
| 472 | + not in Integer_Types |
| 473 | + for _type in types.split(",") |
| 474 | + ): |
| 475 | + primary += "\n\tPRIMARY KEY ({})".format( |
| 476 | + ", ".join(f'"{column}"' for column in columns.split(",")) |
| 477 | + ) |
445 | 478 | else:
|
446 | 479 | indices += """CREATE {unique} INDEX IF NOT EXISTS "{name}" ON "{table}" ({columns});""".format(
|
447 | 480 | unique="UNIQUE" if index["unique"] in {1, "1"} else "",
|
448 |
| - name=f"{table_name}_{index_name}" |
449 |
| - if (table_collisions > 0 or self._prefix_indices) |
450 |
| - else index_name, |
| 481 | + name=( |
| 482 | + f"{table_name}_{index_name}" |
| 483 | + if (table_collisions > 0 or self._prefix_indices) |
| 484 | + else index_name |
| 485 | + ), |
451 | 486 | table=table_name,
|
452 | 487 | columns=", ".join(f'"{column}"' for column in columns.split(",")),
|
453 | 488 | )
|
@@ -481,9 +516,11 @@ def _build_create_table_sql(self, table_name: str) -> str:
|
481 | 516 | c.UPDATE_RULE,
|
482 | 517 | c.DELETE_RULE
|
483 | 518 | """.format(
|
484 |
| - JOIN="JOIN" |
485 |
| - if (server_version is not None and server_version[0] == 8 and server_version[2] > 19) |
486 |
| - else "LEFT JOIN" |
| 519 | + JOIN=( |
| 520 | + "JOIN" |
| 521 | + if (server_version is not None and server_version[0] == 8 and server_version[2] > 19) |
| 522 | + else "LEFT JOIN" |
| 523 | + ) |
487 | 524 | ),
|
488 | 525 | (self._mysql_database, table_name, "FOREIGN KEY"),
|
489 | 526 | )
|
|
0 commit comments