首页 > 解决方案 > 使用 Python 3 连接到 PostgreSQL 不起作用:create_engine(URL(**settings.DATABASE))

问题描述

我按照教程学习了使用 scrapy 进行网络抓取。尽管许多部分已经过时,即使在针对项目检查了打开的拉取请求之后,我还是遇到了一些问题。不过,我确实坚持了下来,并使用 Python 3(而不是 2.7)和最新的组件再次启动了该项目。我在scrapy docs中读了一点,并让它与我感兴趣的网站之一一起使用,但有一个问题。

问题

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 中,但如果有问题,我愿意接受其他解决方案。请分享一些见解。

设置.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声明

标签: postgresqlsqlalchemyscrapypython-3.6

解决方案


DATABASE未在文档中列出并尝试将其导入import settingsimport scrapy.settings已失败。我让它与以下代码一起工作,同时将数据保存在 settings.py 中:

import scrape_tut.settings

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

推荐阅读