ich Ubuntu 9.04mit Pyodbc auf ubuntu ein Bildfeld auf SQL Server einfügen
Ich habe die folgenden Paketversionen installiert bin mit:
unixodbc and unixodbc-dev: 2.2.11-16build3
tdsodbc: 0.82-4
libsybdb5: 0.82-4
freetds-common and freetds-dev: 0.82-4
python2.6-dev
ich /etc/unixodbc.ini
wie diese konfiguriert haben:
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/odbc/libtdsodbc.so
Setup = /usr/lib/odbc/libtdsS.so
CPTimeout =
CPReuse =
UsageCount = 2
Ich habe /etc/freetds/freetds.conf
wie folgt konfiguriert:
[global]
tds version = 8.0
client charset = UTF-8
text size = 4294967295
Ich habe Pyodbc Revision packte 31e2fae4adbf1b2af1726e5668a3414cf46b454f
von http://github.com/mkleehammer/pyodbc
und installierte es auf meinem lokalen Netzwerk „python setup.py install
“
Ich habe einen Windows-Rechner mit Microsoft SQL Server 2000 installiert wird, und auf der lokalen IP-Hören Adresse 10.32.42.69. Ich habe eine leere Datenbank mit dem Namen "Common" erstellt. Ich habe den Benutzer "sa" mit Passwort "geheim" mit vollen Rechten.
Ich bin mit dem folgenden Python-Code zum Einrichten der Verbindung:
import pyodbc
odbcstring = "SERVER=10.32.42.69;UID=sa;PWD=secret;DATABASE=Common;DRIVER=FreeTDS"
con = pyodbc.connect(odbcstring)
cur = con.cursor()
cur.execute("""
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'testing')
DROP TABLE testing
""")
cur.execute('''
CREATE TABLE testing (
id INTEGER NOT NULL IDENTITY(1,1),
myimage IMAGE NULL,
PRIMARY KEY (id)
)
''')
con.commit()
Alles bis zu diesem Punkt funktioniert. Ich habe SQL Server Enterprise Manager auf dem Server verwendet und die neue Tabelle ist da. Jetzt möchte ich einige Daten in die Tabelle einfügen.
cur = con.cursor()
# using web data for exact reproduction of the error by all.
# I'm actually reading a local file in my real code.
url = 'http://www.forestwander.com/wp-content/original/2009_02/west-virginia-mountains.jpg'
data = urllib2.urlopen(url).read()
sql = "INSERT INTO testing (myimage) VALUES (?)"
Jetzt hier auf meiner ursprünglichen Frage war ich Probleme, cur.execute(sql, (data,))
verwenden, aber jetzt habe ich die Frage bearbeitet, weil folgende Vinay Sajip Antwort unten (DANKE), es es geändert haben:
cur.execute(sql, (pyodbc.Binary(data),))
con.commit()
Und Einfügung funktioniert einwandfrei. Ich kann die Größe der eingefügten Daten mit dem folgenden Testcode bestätigen:
cur.execute('SELECT DATALENGTH(myimage) FROM testing WHERE id = 1')
data_inside = cur.fetchone()[0]
assert data_inside == len(data)
Welche perfekt geht !!!
Jetzt ist das Problem beim Abrufen der Daten zurück.
ich den gemeinsamen Ansatz versuchen:
cur.execute('SELECT myimage FROM testing WHERE id = 1')
result = cur.fetchone()
returned_data = str(result[0]) # transforming buffer object
print 'Original: %d; Returned: %d' % (len(data), len(returned_data))
assert data == returned_data
jedoch, die nicht !!
Original: 4744611; Returned: 4096
Traceback (most recent call last):
File "/home/nosklo/devel/teste_mssql_pyodbc_unicode.py", line 53, in <module>
assert data == returned_data
AssertionError
Ich habe in einer einzigen Datei über die gesamten Code setzen here, für die einfache Prüfung von jemandem, der helfen will.
Nun zur Frage:
Ich möchte Python-Code eine Bilddatei in mssql einzufügen. Ich möchte das Bild zurückfragen und es dem Benutzer zeigen.
Ich interessiere mich nicht für den Spaltentyp in mssql.Ich verwende den Spaltentyp "IMAGE
" im Beispiel, aber irgendein binärer/blob Typ würde tun, solange ich die binären Daten für die Datei bekomme, die ich unberührt eingefügt habe. Vinay Sajip sagte unten, dass dies der bevorzugte Datentyp dafür in SQL SERVER 2000 ist.
Die Daten werden jetzt ohne Fehler eingefügt, aber wenn ich die Daten abrufe, werden nur 4k zurückgegeben. (Daten werden bei 4096 abgeschnitten).
Wie kann ich das machen?
EDITS: Vinay Sajip Antwort gab mir unter einen Hinweis pyodbc.Binary auf dem Feld zu verwenden. Ich habe die Frage entsprechend aktualisiert. Danke Vinay Sajip!
Alex Martellis Kommentar gab mir die Idee, die MS SQL-Funktion DATALENGTH
zu verwenden, um zu testen, ob die Daten vollständig in der Spalte geladen sind. Danke Alex Martelli!
was erhalten Sie, wenn Sie "DATALENGTH (myimage) FROM testing" wählen? Zumindest wird Ihnen das sagen, ob Ihr Problem beim Speichern oder beim Abrufen liegt. –