sqlalchemy

时间:2017-01-20 10:24:19

标签: python postgresql sqlalchemy

我使用sqlalchemypostgresql完全是新手。我阅读了this教程来构建以下代码:

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'))

运行时我有这个错误:

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

我该怎么办?谢谢!

1 个答案:

答案 0 :(得分:2)

所以,你的问题正在发生,因为你已经打过电话了:

from sqlalchemy import engine 

然后你在文件中使用了它:

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

奇怪的是,在该部分中,您有一些只有conmeta的语句,没有任何分配或调用或任何内容。我不确定你在那里做什么。我建议您查看engine and connection use上的SQLalchemy页面,以帮助您排序。

这当然取决于您如何设置数据库。我在我的一个项目中使用了declarative_base模块,因此我设置会话以连接到我的数据库的过程如下所示:

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()

在我的数据库设置文件中,我已分配:

Base = declarative_base()

但是你必须根据你的特定设置进行一些自定义。我希望有所帮助。

修改:我现在看到那些来自conmeta的来电,以及其他令人困惑的线路,它是您链接到的教程的一部分。他在该教程中所做的是在命令行中使用Python解释器。我将解释他在那里所做的一些事情,希望它能帮到你更多。以>>>开头的行是他作为命令输入的内容。其他行是他收到的输出。

>>> 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))