Wenn ich versuche, einen Datenrahmen mit einem Textindex speichern in einer MySQL-Datenbank, die ich den Fehler „BLOB/TEXT-Spalte in Schlüsselspezifikation ohne Schlüssellänge verwendet“ erhalten, zum Beispiel:Können Pandas mit MySQL Textindizes unterstützen?
import pandas as pd
import sqlalchemy as sa
df = pd.DataFrame(
{'Id': ['AJP2008H', 'BFA2010Z'],
'Date': pd.to_datetime(['2010-05-05', '2010-07-05']),
'Value': [74.2, 52.3]})
df.set_index(['Id', 'Date'], inplace=True)
engine = sa.create_engine(db_connection)
conn = engine.connect()
df.to_sql('test_table_index', conn, if_exists='replace')
conn.close()
wird den Fehler erzeugen :
InternalError: (pymysql.err.InternalError)
(1170, "BLOB/TEXT column 'Id' used in key specification without a key length")
[SQL: 'CREATE INDEX `ix_test_table_index_Id` ON test_table_index (`Id`)']
Wenn ich den Index nicht einstellen, funktioniert es gut. Gibt es eine Möglichkeit, sie zu speichern, ohne direkt auf SQLAlchemy zu verweisen, um zuerst die Tabelle zu erstellen?
(Dies ist meine aktuelle SQLAlchemy Abhilfe:
table = Table(
name, self.metadata,
Column('Id', String(ID_LENGTH), primary_key=True),
Column('Date', DateTime, primary_key=True),
Column('Value', String(VALUE_LENGTH)))
sa.MetaData().create_all(engine) # Creates the table if it doens't exist
)
Große Antwort, ich hatte gehofft, dass es sein könnte, eine generische Weise ein bisschen wie [sql_length in sqlalchemy] (http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#index-length), Pandas einfach eine Länge zu geben, die es für Textfelder verwenden sollte Wenn wir also to_sql aufrufen, brauchen wir nichts über die Spaltentypen zu wissen. Wahrscheinlich nicht dann. – danio
@danio, ich habe meine Antwort aktualisiert - etwas generischer gemacht ... – MaxU