У меня проблема в том, что функция pandas to_ sql не помещает правильные dtypes в базу данных SQLite 3 . Он автоматически определяет типы и игнорирует типы, указанные в предоставленном словаре. Я пробовал много вариантов или типов записи, таких как ' int ', ' integer ', ' float ', ' real ' , ' плавающий ', пытался показать их напрямую или с использованием методов sqlalchemy.types .
Прилагаю также скриншот с типами и типами столбцов БД SQLite в csv-файле, используемом для импорта в БД SQLite. Типы столбцов БД SQLite всегда одинаковы, независимо от того, какие типы данных я показал.
def generate_dtypes_for_sql(filename, separator, decimal, skip_errors, quoting, engine, shape):
df2 = pd.DataFrame()
if os.path.isfile(filename):
try:
df = load_csv(filename, separator, decimal, skip_errors, quoting, engine, shape)
params_to_import = {}
cols = df.columns
i_arc = 7; i_name = 6; i_type = 3; i_factor = 5
params_types = ['boolean', 'integer', 'float', 'text']
if (i_arc==cols.get_loc('Архивация') and
i_name==cols.get_loc('Символьный тэг') and
i_type==cols.get_loc('Тип')):
for index, row in df.iterrows():
if row[i_arc] == 1:
if math.isnan(row[i_type]):
params_to_import[row[i_name]] = params_types[3]
elif row[i_type] in range(6):
if row[i_factor] == 1:
params_to_import[row[i_name]] = params_types[1]
else:
params_to_import[row[i_name]] = params_types[2]
elif row[i_type] == 6:
params_to_import[row[i_name]] = params_types[2]
else:
params_to_import[row[i_name]] = params_types[3]
df2 = pd.DataFrame([params_to_import])
df2.T.to_csv("params_to_import.csv", sep=";", index_label="Name", header=['Type'])
except LoadCsvError as e:
click.echo("Could not load {}: {}".format(filename, e), err=True)
return df2
def sqlcol(dfparam):
dtypedict = {}
for index, values in dfparam.items():
for value in values:
if value == "boolean":
dtypedict.update({index: sqlalchemy.types.Boolean()})
elif value == "integer":
dtypedict.update({index: sqlalchemy.types.Integer()})
elif value == "float":
dtypedict.update({index: sqlalchemy.types.Float()})
elif value == "text":
dtypedict.update({index: sqlalchemy.types.Text()})
return dtypedict
df_for_sql = generate_dtypes_for_sql(types_file, separator, decimal, skip_errors, quoting, engine, shape)
df_dtypes = sqlcol(df_for_sql)
conn = sqlite3.connect(dbname, detect_types=sqlite3.PARSE_DECLTYPES)
df.to_sql(df.name, conn, if_exists="append", index=False, dtype=df_dtypes_str)
Решение: Не знаю почему, но pandas to_ sql функция игнорирует dtype , только если я использую ее с флагом: if_exists = "append" . Но если я использую его с флагом if_exists = "replace" , он будет работать нормально.