4

I am trying to write a table to a PostgreSQL database from a Pandas data frame (following this answer) but I am getting the error AttributeError: 'Engine' object has no attribute 'cursor'

My code is:

import pandas as pd
from sqlalchemy import create_engine
import numpy as np

df = pd.DataFrame(index=np.arange(1, 11), 
                  data=np.random.random(size=(10, 10)),
                  columns=['c{}'.format(i) for i in np.arange(1, 11)])

engine = create_engine('postgresql://user@localhost:5432/db')
df.to_sql('scores', engine)

engine can connect to the db and return table names.

I am using Python 2.7.8, Pandas 0.15.2, Sqlalchmey 1.0.10 and Postgre 9.4.5.0

---- EDIT ----

I should add that I was getting the error when running this code from within a Jupyter notebook (iPython 3.0.0). When I run from a Python command line it works fine.

---- Full traceback ----

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-276-da2dfbe48036> in <module>()
      8 
      9 engine = create_engine('postgresql://phil@localhost:5432/rh')
---> 10 df.to_sql('scores', con=engine)

/Library/Python/2.7/site-packages/pandas/core/generic.pyc in to_sql(self, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype)
    964             self, name, con, flavor=flavor, schema=schema, if_exists=if_exists,
    965             index=index, index_label=index_label, chunksize=chunksize,
--> 966             dtype=dtype)
    967 
    968     def to_pickle(self, path):

/Library/Python/2.7/site-packages/pandas/io/sql.pyc in to_sql(frame, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype)
    536     pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index,
    537                       index_label=index_label, schema=schema,
--> 538                       chunksize=chunksize, dtype=dtype)
    539 
    540 

/Library/Python/2.7/site-packages/pandas/io/sql.pyc in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype)
   1502                             if_exists=if_exists, index_label=index_label,
   1503                             dtype=dtype)
-> 1504         table.create()
   1505         table.insert(chunksize)
   1506 

/Library/Python/2.7/site-packages/pandas/io/sql.pyc in create(self)
    635 
    636     def create(self):
--> 637         if self.exists():
    638             if self.if_exists == 'fail':
    639                 raise ValueError("Table '%s' already exists." % self.name)

/Library/Python/2.7/site-packages/pandas/io/sql.pyc in exists(self)
    623 
    624     def exists(self):
--> 625         return self.pd_sql.has_table(self.name, self.schema)
    626 
    627     def sql_schema(self):

/Library/Python/2.7/site-packages/pandas/io/sql.pyc in has_table(self, name, schema)
   1512         query = flavor_map.get(self.flavor)
   1513 
-> 1514         return len(self.execute(query).fetchall()) > 0
   1515 
   1516     def get_table(self, table_name, schema=None):

/Library/Python/2.7/site-packages/pandas/io/sql.pyc in execute(self, *args, **kwargs)
   1403             cur = self.con
   1404         else:
-> 1405             cur = self.con.cursor()
   1406         try:
   1407             if kwargs:

AttributeError: 'Engine' object has no attribute 'cursor'
10
  • what version of psycopg2 are you using? Commented Dec 16, 2015 at 1:38
  • Does this need psycopg2? Anyway I am running 2.6.1 Commented Dec 16, 2015 at 2:35
  • 2
    This may be an iPython issue as I am running from a notebook - when I run from the Python command line it works OK Commented Dec 16, 2015 at 2:36
  • it also works for me from the python interpreter, though it also works in jupyter. can you edit the question to describe exactly how you're running this? Commented Dec 16, 2015 at 2:55
  • Can you check your pandas version again? By printing pd.__version__ both in the notebook as in the python command line. It is possible that it is picking a different version (the error you see could be explained by having an older pandas version) Commented Dec 16, 2015 at 14:20

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.