我有各种类似(但不完全相同)的数据库,并希望使用SQLAlchemy作为"标准化"访问的方式.数据库可以略有不同,例如在列名称上具有唯一的前缀,或者它们可以更显着地区别并且缺少列(或者对于旧数据库,缺少整个表).
我正在寻求帮助的不是SQLAlchemy问题,而是Python /组织问题.如何才能轻松设置多个可在项目中重复使用的数据库?
我已经阅读了关于SQLAlchemy会话的内容,但是在没有实例化每个项目的情况下都看不到使用它们的方法.
我的问题是:我如何制作一个模块/包,其中包含许多数据库模型设置,可以在SQLAlchemy中使用,可以在另一个python项目中轻松导入/使用?
我还没有那么担心处理丢失的列/表.我可以稍后解决这个问题,但需要记住这一点,因为我不能为每个数据库使用完全相同的模型.
关于这个主题的任何资源,指针或阅读材料都将得到真正的赞赏.在此先感谢,如果在其他地方已经回答,我很抱歉,搜索没有显示与此相关的任何内容.
编辑:我原来保留原文,并根据保罗的建议添加更多内容.
RE:SA ORM - 是的,我计划使用SQLAlchemy ORM.由于可能是显而易见的原因,我无法提供真正的数据库.但是,假设这三个虚构的数据库,恰当地命名为DB1,DB2和DB3(我们假设每个数据库中只有一个表,只有几列,现实世界中两者都要多得多).
每个数据库都有一个用户表,每个用户表中都有几列.以下是表/列的一些SQL表示法:
DB1.user --> DB1.user.id, DB1.user.username, DB1.user.email
DB2.user --> DB2.user.id, DB2.user.user_name, DB2.user.email
DB3._user --> DB3._user.userid, DB3._user.username, DB3.user.email_address
Run Code Online (Sandbox Code Playgroud)
目前,我正在尝试将这些数据库分离为"模块化",并且能够随时添加其他数据库.
我考虑了几个不同的文件组织方面(假设__init__.py存在于需要的地方,但为了简洁而省略),包括:
Databases | Databases | Databases
DB1.py | DB1 | DB1
DB2.py | models.py | models
DB3.py | DB2 | user.py
| models.py | anothertable.py
| DB2 | ...
| models.py | DB3
| | models
| | user.py
| | anothertable.py
Run Code Online (Sandbox Code Playgroud)
我希望能够使用SA ORM访问这些,并且当在python文件中使用这些数据库时,尽可能少地导入/声明.需要做类似的事情:
from sqlalchemy import create_engine
from …Run Code Online (Sandbox Code Playgroud) PhantomJS's当PhantomJS与Selenium和Python结合使用时,是否可以使用渲染到PDF功能?(即page.render('file.pdf')通过Selenium 模仿Python内部的行为).
我意识到这种用途GhostDriver,并GhostDriver没有真正支持打印的方式.
如果另一种替代品可能不是Selenium,我全都耳朵.
首先,我对此非常新,所以请准备好从我复制/粘贴来自各种来源的代码.
我希望能够删除任何scrapy返回的HTML代码.我已经将所有内容存储在MySQL中没有任何问题,但我无法工作的东西是删除了很多'<td>'和其他html标签.我最初只使用/ text().extract()运行,但随机它会遇到以这种方式格式化的单元格:
<td> <span class="caps">TEXT</span> </td>
<td> Text </td>
<td> Text </td>
<td> Text </td>
<td> Text </td>
Run Code Online (Sandbox Code Playgroud)
没有一种模式,我可以在使用/文本之间选择,我正在寻找初学者可以实现的最简单的方法,将剥离所有这些.
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.loader import XPathItemLoader
from scrapy.contrib.loader.processor import Join, MapCompose
import html2text
from scraper.items import LivingSocialDeal
class CFBDVRB(BaseSpider):
name = "cfbdvrb"
allowed_domains = ["url"]
start_urls = [
"url",
]
deals_list_xpath = '//table[@class="tbl data-table"]/tbody/tr'
item_fields = {
'title': './/td[1]',
'link': './/td[2]',
'location': './/td[3]',
'original_price': './/td[4]',
'price': './/td[5]',
}
def parse(self, response):
selector = HtmlXPathSelector(response) …Run Code Online (Sandbox Code Playgroud) 有没有办法有效地将Selenium集成到Scrapy中,以获得页面渲染功能(为了生成屏幕截图)?
我看到的很多解决方案只是在 Scrapy已经处理完请求后在WebDriver上抛出一个Scrapy请求/响应URL ,然后就这样做了.这会产生两倍的请求,在许多方面失败(需要登录的站点,具有动态或伪随机内容的站点等),并使许多扩展/中间件无效.
是否有任何"好"的方式让两个人一起工作?有没有更好的方法来生成我正在抓取的内容的屏幕截图?
背景
我正在寻找一种方法将Python和Peewee的MySQL查询结果转储到excel文件,包括数据库列标题.我希望导出的内容按照与数据库中的列几乎相同的顺序排列.此外,我想要一种方法来跨多个类似的数据库工作,这些数据库的字段可能略有不同.为了澄清,一个数据库可能有一个包含"User,PasswordHash,DOB,[...]"的用户表,而另一个数据库有"User,PasswordHash,Name,DOB,[...]".
问题
我的主要问题是以有序的方式获取列标题.迄今为止的所有尝试都导致了无序的结果,而且所有这些尝试都不那么优雅.
其次,到目前为止,我的方法导致我(个人)讨厌维护的代码,我知道这是一个不好的标志.
到目前为止工作
目前,我使用Peewee的pwiz.py脚本为目标数据库中的每个预先存在的数据库表生成模型,然后输入所有主键和外键.这些关系已经建立,一些简短的测试显示它们正在正确关联.
代码:我设法使用类似的东西获取列标题:
for i, column in enumerate(User._meta.get_field_names()):
ws.cell(row=0,column=i).value = column
Run Code Online (Sandbox Code Playgroud)
如上所述,这是无序的.而且,这样做会迫使我做一些事情
getattr(some_object, title)
Run Code Online (Sandbox Code Playgroud)
相应地动态填充字段.
思想和可能的解决方案
手动写出我想要数组中的东西的顺序,并使用它来循环和填充数据.这种优点是非常严格/精细的控制.缺点是我需要为每个数据库指定这个.
创建(无论是手动还是通过方法)具有所有可能遇到的字段的相关加权值的字段的散列,然后根据权重编写用于排序"_meta.get_field_names()"的方法.这样做的缺点是列可能不是正确顺序的100%,例如在一个DB中DOB之前的名称,而在另一个DB之后.
随意告诉我,我做错了或建议完全不同的做法,我全都耳朵.我非常擅长Python和Peewee(实际上是ORM).我可以切换回Perl并通过DBI进行数据库查询,几乎没有麻烦.但是,它的excel库会给我带来很多问题,我想把它作为扩展我知识的时间.
我有一堆docx具有相同嵌入 Excel 表格的 Word文件。我正在尝试从多个文件中提取相同的单元格。
我想出了如何硬编码到一个文件:
from docx import Document
document = Document(r"G:\GIS\DESIGN\ROW\ROW_Files\Docx\006-087-003.docx")
table = document.tables[0]
Project_cell = table.rows[2].cells[2]
paragraph = Project_cell.paragraphs[0]
Project = paragraph.text
print Project
Run Code Online (Sandbox Code Playgroud)
但是我该如何批处理呢?我在 上尝试了一些变体listdir,但它们对我不起作用,而且我太绿了,无法独自到达那里。
python ×6
scrapy ×2
selenium ×2
docx ×1
openpyxl ×1
peewee ×1
phantomjs ×1
python-2.7 ×1
python-docx ×1
sqlalchemy ×1
web-scraping ×1