我是全新的 sqlalchemy
和 postgresql
。我阅读了 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')
奇怪的是,在该部分中,您有一些只是
con
和 meta
的语句,没有赋值或调用或任何其他内容。我不确定你在那里做什么。我建议您查看 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()
但是您必须根据您的特定设置对其进行一些自定义。我希望这有帮助。
编辑 :我现在知道对
con
和 meta
的调用来自哪里,以及其他令人困惑的行,这是您链接到的教程的一部分。他在该教程中所做的是在命令行中使用 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/