我是全新的 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

我应该怎么办 ?谢谢 !

最佳答案

所以,你的问题正在发生,因为你打了这个电话:

from sqlalchemy import engine

然后您稍后在文件中使用了它:
engine('postgresql://federer:***@localhost:5432/tennis')

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

这当然取决于您如何设置数据库。我在我的一个项目中使用了 declarative_base 模块,因此我设置 session 以连接到我的数据库的过程如下所示:
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))

关于python - “模块”对象不能用 sqlalchemy 调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41761266/

10-14 14:32
查看更多