У меня есть данные с (неизвестного) сервера MSSQL в столбце типа Image
(думаю, это старый вариант varbinary
).
Я хочу создать сценарий (желательно на Python или Typescript, но открытый для чего угодно), который может принимать данные, подобные тем, что указаны в приведенной ниже сути, и выдавать файлы.
Я попробовал несколько подходов, но не смог преобразовать файл, указанный ниже: преобразованный файл повреждается. Полагаю, это связано с моими недостатками в навыках кодирования/конвертирования.
https://gist.github.com/tomfa/2f9e63ee1cc3cd012ac4c9b1031de39f
Ниже приведена моя попытка декодирования данных с помощью Python. Код работает нормально, но выходной PDF-файл недействителен.
import binascii
s = open("data.dat").read()
# chop off the '0x' at the front.
s = s[2:]
# Decode hex to binary.
binary = binascii.unhexlify(s)
with open("test123.pdf", 'wb') as f:
f.write(binary)
«столбец типа Image
(думаю, это старый вариант varbinary
)». image
является устаревшим типом данных и существует с 2005 года. Вам давно следовало перейти на varbinary(MAX)
, который заменил image
.
КАК здесь связана случайная ссылка на GitHub? Если вы хотите включить информацию, включите ее в вопрос. Ссылка не указана ни в каком контексте и поэтому не имеет значения.
@ThomA Да, это уже давно устарело. Я пытаюсь извлечь данные из старой базы данных. Суть Github актуальна, поскольку она включает примеры данных, которые я не могу преобразовать. Это ~ 200 КБ, следует ли мне включить его сюда?
Вы можете загружать изображения в Stack Overflow, да. Нам также необходимо увидеть ваши попытки; мы не можем объяснить, почему это не работает, если вы не знаете, что это за попытки.
@siggemannen Добавлен подход, который у меня не работает. Я также добавил исходный PDF-файл в суть, если это полезно.
Не нужно делать ни # chop off the '0x' at the front
ни binascii.unhexlify(s)
бинарник в sql сервере просто бинарный, никаких манипуляций не нужно, просто читаем и записываем. То, что вы видите при запросе, обычно представляет собой шестнадцатеричную версию для женщин, сделанную так, чтобы она выглядела читабельной. Кроме того, почему вы читаете из файла, а не с сервера sql в своем коде?
@siggemannen Мне кажется, вы предлагаете код Python ниже? Это просто воссоздает файл? ``` s = open("data.dat").read() с open("test123.txt", 'w') как f: f.write(s) ``` Я был бы очень признателен, если бы вы любой пример кода, который работает для связанного кода, на любом языке.
Но вы читаете не из файла в своем «реальном коде», а с sql-сервера? Или я что-то упускаю, или вы действительно записали данные с сервера sql в файл и теперь хотите прочитать из файла?
@siggemannen Я готов на все. Я также написал приведенный ниже код для чтения с сервера, но я не включил его, поскольку никто другой не может протестировать/проверить его самостоятельно. Вот этот код, если интересно: gist.github.com/tomfa/859a4ab265f159a86da6345eff045266
Чтобы ответить на ваш вопрос @siggemannen: мне просто нужно экспортировать старую базу данных. так что мой «настоящий код» — это всего лишь одноразовый сценарий. Другими словами, не важно, какой язык или метод используется для преобразования данных.
Кажется, поле изображения было заархивировано, и данные необходимо было разархивировать, прежде чем их можно будет прочитать.
from os import getenv
import pymssql
import zipfile
conn = pymssql.connect('server', 'user', 'password', 'database')
cursor = conn.cursor()
cursor.execute("""
SELECT %s, %s FROM %s;
""" % ('filename_column', 'image_column', 'table'))
def unzip(archive):
with zipfile.ZipFile(archive, 'r') as zip:
for file in zip.namelist():
zip.extract(member=file)
row = cursor.fetchone()
while row:
filename = row[1]
imagedata = row[2]
zip_path = f'./{filename}.zip'
with open(zip_path, 'wb') as f:
print("Writing %s" % filename)
f.write(imagedata)
unzip(zip_path)
row = cursor.fetchone()
conn.close()
Пожалуйста, укажите свой подход, чтобы увидеть, где вы ошибаетесь