Skip to content

Commit adda94c

Browse files
committed
🐛 fix #80
1 parent acd0503 commit adda94c

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/mysql_to_sqlite3/transporter.py

+17-7
Original file line numberDiff line numberDiff line change
@@ -382,14 +382,17 @@ def _build_create_table_sql(self, table_name: str) -> str:
382382
indices: str = ""
383383

384384
self._mysql_cur_dict.execute(f"SHOW COLUMNS FROM `{table_name}`")
385+
rows: t.Sequence[t.Optional[t.Dict[str, RowItemType]]] = self._mysql_cur_dict.fetchall()
385386

386-
for row in self._mysql_cur_dict.fetchall():
387+
primary_keys: int = sum(1 for row in rows if row is not None and row["Key"] == "PRI")
388+
389+
for row in rows:
387390
if row is not None:
388391
column_type = self._translate_type_from_mysql_to_sqlite(
389392
column_type=row["Type"], # type: ignore[arg-type]
390393
sqlite_json1_extension_enabled=self._sqlite_json1_extension_enabled,
391394
)
392-
if row["Key"] == "PRI" and row["Extra"] == "auto_increment":
395+
if row["Key"] == "PRI" and row["Extra"] == "auto_increment" and primary_keys == 1:
393396
if column_type in Integer_Types:
394397
sql += '\n\t"{name}" INTEGER PRIMARY KEY AUTOINCREMENT,'.format(
395398
name=row["Field"].decode() if isinstance(row["Field"], bytes) else row["Field"],
@@ -414,7 +417,7 @@ def _build_create_table_sql(self, table_name: str) -> str:
414417
SELECT s.INDEX_NAME AS `name`,
415418
IF (NON_UNIQUE = 0 AND s.INDEX_NAME = 'PRIMARY', 1, 0) AS `primary`,
416419
IF (NON_UNIQUE = 0 AND s.INDEX_NAME <> 'PRIMARY', 1, 0) AS `unique`,
417-
IF (c.EXTRA = 'auto_increment', 1, 0) AS `auto_increment`,
420+
{auto_increment}
418421
GROUP_CONCAT(s.COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS `columns`,
419422
GROUP_CONCAT(c.COLUMN_TYPE ORDER BY SEQ_IN_INDEX) AS `types`
420423
FROM information_schema.STATISTICS AS s
@@ -424,8 +427,15 @@ def _build_create_table_sql(self, table_name: str) -> str:
424427
AND s.COLUMN_NAME = c.COLUMN_NAME
425428
WHERE s.TABLE_SCHEMA = %s
426429
AND s.TABLE_NAME = %s
427-
GROUP BY s.INDEX_NAME, s.NON_UNIQUE, c.EXTRA
428-
""",
430+
GROUP BY s.INDEX_NAME, s.NON_UNIQUE {group_by_extra}
431+
""".format(
432+
auto_increment=(
433+
"IF (c.EXTRA = 'auto_increment', 1, 0) AS `auto_increment`,"
434+
if primary_keys == 1
435+
else "0 as `auto_increment`,"
436+
),
437+
group_by_extra=" ,c.EXTRA" if primary_keys == 1 else "",
438+
),
429439
(self._mysql_database, table_name),
430440
)
431441
mysql_indices: t.Sequence[t.Optional[t.Dict[str, RowItemType]]] = self._mysql_cur_dict.fetchall()
@@ -476,8 +486,8 @@ def _build_create_table_sql(self, table_name: str) -> str:
476486
not in Integer_Types
477487
for _type in types.split(",")
478488
):
479-
primary += "\n\tPRIMARY KEY ({})".format(
480-
", ".join(f'"{column}"' for column in columns.split(","))
489+
primary += "\n\tPRIMARY KEY ({columns})".format(
490+
columns=", ".join(f'"{column}"' for column in columns.split(","))
481491
)
482492
else:
483493
indices += """CREATE {unique} INDEX IF NOT EXISTS "{name}" ON "{table}" ({columns});""".format(

0 commit comments

Comments
 (0)