Home > Software design >  AttributeError when using pandas to_sql
AttributeError when using pandas to_sql

Time:10-16

I am trying to upload a dataframe to my sqlalchemy model/sqlite database. I have this dataframe

dataset = {'id': [1], 'creationDate':['2022-10-15'], 'value':['5']}
df=pd.DataFrame(data=dataset)
df.to_sql('Apple_health_export', engine, if_exists='append', index=False)

The data does upload to the database but I keep getting this error:

AttributeError: 'function' object has no attribute 'currentframe'

I don’t understand it. Is anyone familiar with what this is or know how I can fix it?

update with github repo

Models.py

from sqlalchemy import create_engine, inspect
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session, relationship
from sqlalchemy import Column, Integer, Text

SQL_URI = r"sqlite:///D:\databases\zTestModels\models02.db"

Base = declarative_base()
engine = create_engine(SQL_URI, echo = False)
Session = sessionmaker(bind = engine)
sess = Session()

class Apple_health_export(Base):
    __tablename__ = 'apple_health_export'
    id = Column(Integer,primary_key = True)
    creationDate = Column(Text)
    value = Column(Text)

    def __repr__(self):
        return f'Apple_health_export(id: {self.id},'  \
            f'creationDate: {self.creationDate})'

#Build db
if 'users' in inspect(engine).get_table_names():
    print('db already exists')
else:
    Base.metadata.create_all(engine)
    print('NEW db created.')

Error traceback

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In [3], line 1
----> 1 df.to_sql('Apple_health_export', engine, if_exists='append', index=False)

File ~\Documents\_environments\ws08web\lib\site-packages\pandas\core\generic.py:2986, in NDFrame.to_sql(self, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)
   2829 """
   2830 Write records stored in a DataFrame to a SQL database.
   2831 
   (...)
   2982 [(1,), (None,), (2,)]
   2983 """  # noqa:E501
   2984 from pandas.io import sql
-> 2986 return sql.to_sql(
   2987     self,
   2988     name,
   2989     con,
   2990     schema=schema,
   2991     if_exists=if_exists,
   2992     index=index,
   2993     index_label=index_label,
   2994     chunksize=chunksize,
   2995     dtype=dtype,
   2996     method=method,
   2997 )

File ~\Documents\_environments\ws08web\lib\site-packages\pandas\io\sql.py:696, in to_sql(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method, engine, **engine_kwargs)
    691 elif not isinstance(frame, DataFrame):
    692     raise NotImplementedError(
    693         "'frame' argument should be either a Series or a DataFrame"
    694     )
--> 696 return pandas_sql.to_sql(
    697     frame,
    698     name,
    699     if_exists=if_exists,
    700     index=index,
    701     index_label=index_label,
    702     schema=schema,
    703     chunksize=chunksize,
    704     dtype=dtype,
    705     method=method,
    706     engine=engine,
    707     **engine_kwargs,
    708 )

File ~\Documents\_environments\ws08web\lib\site-packages\pandas\io\sql.py:1751, in SQLDatabase.to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method, engine, **engine_kwargs)
   1729 table = self.prep_table(
   1730     frame=frame,
   1731     name=name,
   (...)
   1736     dtype=dtype,
   1737 )
   1739 total_inserted = sql_engine.insert_records(
   1740     table=table,
   1741     con=self.connectable,
   (...)
   1748     **engine_kwargs,
   1749 )
-> 1751 self.check_case_sensitive(name=name, schema=schema)
   1752 return total_inserted

File ~\Documents\_environments\ws08web\lib\site-packages\pandas\io\sql.py:1662, in SQLDatabase.check_case_sensitive(self, name, schema)
   1652 if name not in table_names:
   1653     msg = (
   1654         f"The provided table name '{name}' is not found exactly as "
   1655         "such in the database after writing the table, possibly "
   1656         "due to case sensitivity issues. Consider using lower "
   1657         "case table names."
   1658     )
   1659     warnings.warn(
   1660         msg,
   1661         UserWarning,
-> 1662         stacklevel=find_stack_level(inspect.currentframe()),
   1663     )

AttributeError: 'function' object has no attribute 'currentframe'

CodePudding user response:

As the error traceback suggests, there's no table in the database with the given name:

The provided table name '{name}' is not found exactly as such in the database

It seems that this is due to a case sensitivity issue. In the table model:

class Apple_health_export(Base):
    __tablename__ = 'apple_health_export'

In the initial code snippet:

df.to_sql('Apple_health_export', engine, if_exists='append', index=False)

'apple_health_export' is not equal to 'Apple_health_export'.

  • Related