我使用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
我该怎么办?谢谢!
答案 0 :(得分:2)
所以,你的问题正在发生,因为你已经打过电话了:
from sqlalchemy import engine
然后你在文件中使用了它:
engine('postgresql://federer:***@localhost:5432/tennis')
奇怪的是,在该部分中,您有一些只有con
和meta
的语句,没有任何分配或调用或任何内容。我不确定你在那里做什么。我建议您查看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()
但是你必须根据你的特定设置进行一些自定义。我希望有所帮助。
修改:我现在看到那些来自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))