Skip to content

Commit ac853fe

Browse files
authored
🐛 Fix BLOB default value (#36)
1 parent 20ddf23 commit ac853fe

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

mysql_to_sqlite3/transporter.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,24 @@ def _translate_type_from_mysql_to_sqlite(
253253
def _translate_default_from_mysql_to_sqlite(
254254
cls, column_default=None, column_type=None
255255
):
256+
if isinstance(column_default, six.binary_type):
257+
if column_type in {
258+
"BIT",
259+
"BINARY",
260+
"BLOB",
261+
"LONGBLOB",
262+
"MEDIUMBLOB",
263+
"TINYBLOB",
264+
"VARBINARY",
265+
}:
266+
if six.PY2:
267+
try:
268+
return "DEFAULT x'{}'".format(column_default.encode("hex"))
269+
except AttributeError:
270+
pass
271+
else:
272+
return "DEFAULT x'{}'".format(column_default.hex())
273+
256274
try:
257275
column_default = column_default.decode()
258276
except (UnicodeDecodeError, AttributeError):

tests/models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,12 @@ class Misc(Base):
9696
id = Column(Integer, primary_key=True)
9797
big_integer_field = Column(BigInteger, default=0)
9898
big_integer_unsigned_field = Column(BIGINT(unsigned=True), default=0)
99-
large_binary_field = Column(LargeBinary, nullable=True)
99+
if environ.get("LEGACY_DB", "0") == "0":
100+
large_binary_field = Column(
101+
LargeBinary, nullable=True, default=b"Lorem ipsum dolor"
102+
)
103+
else:
104+
large_binary_field = Column(LargeBinary, nullable=True)
100105
boolean_field = Column(Boolean, default=False)
101106
char_field = Column(CHAR(255), nullable=True)
102107
date_field = Column(Date, nullable=True)

tests/unit/mysql_to_sqlite3_test.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,37 @@ def test_translate_default_numbers_from_mysql_to_sqlite(
225225
== sqlite_default_translation
226226
)
227227

228+
@pytest.mark.parametrize(
229+
"column_default, sqlite_default_translation",
230+
[
231+
pytest.param(b"", "DEFAULT x''", id="b''"),
232+
pytest.param(b"-1", "DEFAULT x'2d31'", id="b'-1'"),
233+
pytest.param(b"0", "DEFAULT x'30'", id="b'0'"),
234+
pytest.param(b"1", "DEFAULT x'31'", id="b'1'"),
235+
pytest.param(
236+
b"-1234567890", "DEFAULT x'2d31323334353637383930'", id="b'-1234567890'"
237+
),
238+
pytest.param(
239+
b"1234567890", "DEFAULT x'31323334353637383930'", id="b'1234567890'"
240+
),
241+
pytest.param(b"SQLite", "DEFAULT x'53514c697465'", id="b'SQLite'"),
242+
pytest.param(
243+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam pretium, purus vitae sollicitudin varius, nisi lectus vehicula dui, ut dignissim felis dolor blandit justo. Donec eleifend lectus ut feugiat rhoncus. Donec erat nibh, dapibus nec diam id, lacinia lacinia nisl. Mauris sagittis efficitur nisl. Ut tincidunt elementum rhoncus. Cras suscipit dolor sed est ultricies, quis dapibus neque suscipit. Etiam ac enim eu ligula bibendum blandit quis sit amet felis. Praesent mi nisi, luctus sit amet nunc ut, fermentum tempus purus. Suspendisse vel purus a nibh aliquam hendrerit. Aliquam sit amet tristique lorem. Sed elementum congue ante id mollis. Donec vitae pretium neque.",
244+
"DEFAULT x'4c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e204e616d207072657469756d2c20707572757320766974616520736f6c6c696369747564696e207661726975732c206e697369206c6563747573207665686963756c61206475692c207574206469676e697373696d2066656c697320646f6c6f7220626c616e646974206a7573746f2e20446f6e656320656c656966656e64206c656374757320757420666575676961742072686f6e6375732e20446f6e65632065726174206e6962682c2064617069627573206e6563206469616d2069642c206c6163696e6961206c6163696e6961206e69736c2e204d617572697320736167697474697320656666696369747572206e69736c2e2055742074696e636964756e7420656c656d656e74756d2072686f6e6375732e204372617320737573636970697420646f6c6f72207365642065737420756c747269636965732c20717569732064617069627573206e657175652073757363697069742e20457469616d20616320656e696d206575206c6967756c6120626962656e64756d20626c616e64697420717569732073697420616d65742066656c69732e205072616573656e74206d69206e6973692c206c75637475732073697420616d6574206e756e632075742c206665726d656e74756d2074656d7075732070757275732e2053757370656e64697373652076656c2070757275732061206e69626820616c697175616d2068656e6472657269742e20416c697175616d2073697420616d657420747269737469717565206c6f72656d2e2053656420656c656d656e74756d20636f6e67756520616e7465206964206d6f6c6c69732e20446f6e6563207669746165207072657469756d206e657175652e'",
245+
id="b'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam pretium, purus vitae sollicitudin varius, nisi lectus vehicula dui, ut dignissim felis dolor blandit justo. Donec eleifend lectus ut feugiat rhoncus. Donec erat nibh, dapibus nec diam id, lacinia lacinia nisl. Mauris sagittis efficitur nisl. Ut tincidunt elementum rhoncus. Cras suscipit dolor sed est ultricies, quis dapibus neque suscipit. Etiam ac enim eu ligula bibendum blandit quis sit amet felis. Praesent mi nisi, luctus sit amet nunc ut, fermentum tempus purus. Suspendisse vel purus a nibh aliquam hendrerit. Aliquam sit amet tristique lorem. Sed elementum congue ante id mollis. Donec vitae pretium neque.'",
246+
),
247+
],
248+
)
249+
def test_translate_default_blob_bytes_from_mysql_to_sqlite(
250+
self, column_default, sqlite_default_translation
251+
):
252+
assert (
253+
MySQLtoSQLite._translate_default_from_mysql_to_sqlite(
254+
column_default, "BLOB"
255+
)
256+
== sqlite_default_translation
257+
)
258+
228259
@pytest.mark.parametrize(
229260
"collation, resulting_column_collation, column_type",
230261
[

0 commit comments

Comments
 (0)