使用Python 3与PostgreSQL的连接不起作用:create_engine(URL(** settings.DATABASE))

时间:2018-11-04 22:48:47

标签: postgresql sqlalchemy scrapy python-3.6

我按照this教程学习了有关刮刮的Web刮擦。尽管许多部分已经过时,即使在针对项目检查了pull requests打开之后,我还是遇到了一些问题。不过,我确实遵循了说明,并再次使用Python 3(而不是2.7)和最新的组件开始了该项目。我读了一些草率的文档,并使其与我感兴趣的站点之一一起工作,但是有一个问题。

问题

models.py 包含以下代码:

from sqlalchemy.engine.url import URL

import settings

def db_connect():
    return create_engine(URL(**settings.DATABASE))

这与NameError: name 'settings' is not defined一起运行时会给出scrapy crawl my_spider -o items.json

尝试在此处建议在StackExchange上使用的另一种解决方案:

from sqlalchemy.engine.url import URL

from scrapy.utils.project import get_project_settings

def db_connect():
    settings = get_project_settings()
    return create_engine(URL(**settings.DATABASE))

结果:AttributeError: 'Settings' object has no attribute 'DATABASE'

成功解决所有其他错误后,我不得不替换代码。

    return create_engine("postgresql://scrape:123456@localhost:5432/scrape")

这有效,其他都很好。有人可以告诉我,建议使用什么方法来获取信息并建立连接字符串?我希望将配置数据保留在 settings.py 中,但是如果存在问题,我可以接受其他解决方案。请分享一些见识。

settings.py:

DATABASE = {
    'drivername': 'postgres',
    'host': 'localhost',
    'port': '5432',
    'username': 'scrape',
    'password': '123456',
    'database': 'scrape'
}

项目概述:

├── __init__.py
├── items.py
├── middlewares.py
├── models.py
├── pipelines.py
├── settings.py
└── spiders
    ├── my_spider.py
    └── __init__.py

编辑:添加了from sqlalchemy.engine.url import URL语句

1 个答案:

答案 0 :(得分:1)

DATABASE未在documentation中列出,并且尝试使用import settingsimport scrapy.settings导入它失败。我将其与以下代码一起使用,同时将数据保留在settings.py中:

import scrape_tut.settings

def db_connect():
    return create_engine(URL(**myproject.settings.DATABASE))