简体   繁体   中英

'module' object is not callable with sqlalchemy

I'm totally new using sqlalchemy and postgresql . I read this tutorial to build the following piece of code :

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import engine 


def connect(user, password, db, host='localhost', port=5432):
    '''Returns a connection and a metadata object'''
    # We connect with the help of the PostgreSQL URL
    # postgresql://federer:grandestslam@localhost:5432/tennis
    url = 'postgresql://{}:{}@{}:{}/{}'
    url = url.format(user, password, host, port, db)

    # The return value of create_engine() is our connection object
    con = sqlalchemy.create_engine(url, client_encoding='utf8')

    # We then bind the connection to MetaData()
    meta = sqlalchemy.MetaData(bind=con, reflect=True)

    return con, meta

con, meta = connect('federer', 'grandestslam', 'tennis')
con
engine('postgresql://federer:***@localhost:5432/tennis')
meta
MetaData(bind=Engine('postgresql://federer:***@localhost:5432/tennis'))

When running it I have this error :

  File "test.py", line 22, in <module>
  engine('postgresql://federer:***@localhost:5432/tennis')
  TypeError: 'module' object is not callable

what should I do ? thanks !

So, your problem is happening because you've made this call:

from sqlalchemy import engine 

And then you've used this later in the file:

engine('postgresql://federer:***@localhost:5432/tennis')

Strangely, in that section, you have some statements that are just con and meta with no assignments or calls or anything. I'm not sure what you're doing there. I would suggest that you check out SQLalchemy's page on engine and connection use to help get you sorted.

It will of course depend on exactly how you've set up your database. I used the declarative_base module in one of my projects, so my process of setting up a session to connect to my DB looks like this:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# Connect to Database and create database session
engine = create_engine('postgresql://catalog:catalog@localhost/menus')
Base.metadata.bind = engine

DBSession = sessionmaker(bind=engine)
session = DBSession()

And in my database setup file, I've assigned:

Base = declarative_base()

But you'll have to customize it a bit to your particular setup. I hope that helps.

Edit : I see now where those calls to con and meta were coming from, as well as your other confusing lines, it's part of the tutorial you linked to. What he was doing in that tutorial was using the Python interpreter in command line. I'll explain a few of the things he did there in the hope that it helps you some more. Lines beginning with >>> are what he enters in as commands. The other lines are the output he receives back.

>>> con, meta = connect('federer', 'grandestslam', 'tennis') # he creates the connection and meta objects
>>> con # now he calls the connection by itself to have it show that it's connected to his DB
Engine(postgresql://federer:***@localhost:5432/tennis)
>>> meta # here he calls his meta object to show how it, too, is connected
MetaData(bind=Engine(postgresql://federer:***@localhost:5432/tennis))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM