Используйте Sqlalchemy для подключения SQL Server — Панды

#python #sql #sql-server #pandas #sqlalchemy

Вопрос:

Попробуйте записать фрейм данных в БД, но получите сообщение об ошибке ниже.

Создать Фрейм данных

 import pandas as pd
d = {'col1': [1, 2], 'col2': ['VIP', 'Eco']}
df = pd.DataFrame(data=d)
 

Подключение к SQL Server в Azure

 from sqlalchemy import create_engine
engine =  create_engine
('mssql pyodbc://user:pass@dns:1433/database')
 

Попробуйте вставить данные в БД

 from sqlalchemy.sql import table, column, select, update, insert
from sqlalchemy.types import Integer, Text, String, DateTime

df.to_sql(
    'Table_Test',
    engine,
    if_exists='append',
    index=False,
    chunksize=100,
    dtype = {
    "ID" : Integer,
    "Type" : String(10)}
    )
 

Ошибка

 ValueError: ID (<class 'sqlalchemy.sql.sqltypes.Integer'>) not a string
 

Версия для Панд: «1.1.5»

полная ошибка

 try:...
Traceback (most recent call last):
  File "<ipython-input-19-993c20acc8ac>", line 2, in <module>
    df.to_sql(
  File "C:anaconda3libsite-packagespandascoregeneric.py", line 2605, in to_sql
    sql.to_sql(
  File "C:anaconda3libsite-packagespandasiosql.py", line 589, in to_sql
    pandas_sql.to_sql(
  File "C:anaconda3libsite-packagespandasiosql.py", line 1816, in to_sql
    raise ValueError(f"{col} ({my_type}) not a string")
ValueError: ID (<class 'sqlalchemy.sql.sqltypes.Integer'>) not a string
 

Спасибо

Комментарии:

1. @SuperShoot, пожалуйста, была добавлена полная трассировка ошибок. Спасибо

2. engine = create_engine ('mssql pyodbc://user:pass@dns:1433/database') Действительно ли в вашем коде более 2 строк?

3. Если это так, я бы сказал, что это ваша проблема, так как это будет назначено engine = create_engine , и поэтому, когда pandas проверяет, что данное соединение является подключаемым к sqlalchemy, он выходит из строя и использует SQLiteDatabase объект, который предполагает, что dtype arg to to_sql() -это дикт строковых значений.

4. Вы пробовали "ID" : Integer() вместо "ID" : Integer этого ?

5. @AlwaysLearning, все еще получаю ошибку