首先让我说,我认为没有办法做到这一点……但是,那里有很多聪明人,所以我想我会问!:)
我找到了 Randall Degges 关于在 Heroku上设置 Django 应用程序的一篇很好的文章/帖子(互联网档案链接)。我真的很喜欢他关于将您的需求分解成不同文件(common.txt、dev.txt、prod.txt 等)的说法。
这在 Heroku 上非常适合用于生产,但我还在 Heroku 上维护了一个 Dev/QA 站点,并且我有一些我确实不需要用于开发/QA 的生产包。最好的例子是 django-debug-toolbar。目前,我的生产需求.txt 中确实有这个,并且我在运行时通过查看 DEBUG 设置动态决定是否需要将它添加到 settings.py 中的已安装应用程序等中。
哪个工作得很好……但是,如果我什至不费心在产品中安装它,那就太好了。我想我想要的是 pip 能够获取一个允许条件包含的需求文件(为什么它不能只获取一个 python 文件?)或者让 Heroku 支持一个配置设置,告诉它哪个需求文件使用。有没有人找到实现这一目标的方法?还是只是一厢情愿?
我有一点"upsert"类型的问题...但是,我想把它扔出去,因为它与我在stackoverflow上读到的任何东西都有点不同.
基本问题.
我正在努力从mysql迁移到PostgreSQL 9.1.5(在Heroku上托管).作为其中的一部分,我需要每天导入多个CSV文件.一些数据是销售信息,几乎保证是新的,需要插入.但是,数据的其他部分几乎保证是相同的.例如,csv文件(注释复数)将在其中具有POS(销售点)信息.这很少改变(最有可能只是通过添加).然后是产品信息.大约有10,000种产品(绝大多数产品将保持不变,但可以同时添加和更新).
最后一项(但很重要)是,我要求能够为任何给定项目提供审计跟踪/信息.例如,如果我添加一个新的POS记录,我需要能够追溯到它找到的文件.如果我更改了UPC代码或产品描述,那么我需要能够追溯它到变更来自的导入(和文件).
我正在考虑的解决方案.
由于数据是通过CSV提供给我的,所以我正在努力解决COPY将是最好/最快的方法.文件中数据的结构与数据库中的数据结构不同(即最终目的地).因此,我将它们复制到与CSV匹配的登台模式中的表中(注意:每个数据源一个模式).登台模式中的表将具有前插入行触发器.这些触发器可以决定如何处理数据(插入,更新或忽略).
对于最有可能包含新数据的表,它将首先尝试插入.如果记录已经存在,那么它将返回NULL(并将插入停止到登台表中).对于很少更改的表,它将查询表并查看是否找到了记录.如果是,那么我需要一种方法来查看是否有任何字段被更改.(因为记住,我需要表明记录是通过从文件y导入x来修改的)我显然可以将代码清空并测试每一列.但是,正在寻找一些比这更"雄辩"和更易于维护的东西.
在某种程度上,我正在做的是将导入系统与审计跟踪系统相结合.因此,在研究审计跟踪时,我查看了以下wiki.postgresql.org文章.似乎hstore可能是获取更改的一种很好的方式(并且能够轻松忽略表中不重要的某些列 - 例如"last_modified")
我大约90%肯定它会全部工作......我已经创建了一些测试表等,并玩弄它.
我的问题?
是一种更好,更易于维护的方法来完成从10K中找到需要更改数据库的3条记录的任务.我当然可以编写一个python脚本(或其他东西)来读取文件,并试图弄清楚如何处理每条记录,但这种效率非常低效,并且会导致大量的往返行程.
最后几件事:
我已经使用Django好几年了,但最近决定尝试使用Flask来获得新的API.感谢Carl Meyers 在PyCon 上测试Django的精彩演示,我一直在使用以下技术来防止在我的Django单元测试中触摸数据库:
cursor_wrapper = Mock()
cursor_wrapper.side_effect = RuntimeError("No touching the database!")
@patch('django.db.backends.util.CursorWrapper', cursor_wrapper)
class TestPurchaseModel(TestCase):
'''Purchase model test suite'''
...
Run Code Online (Sandbox Code Playgroud)
我的问题是,任何人都可以告诉我如何使用SQLAlchemy执行相同的基本技术吗?换句话说,我希望任何时候我实际上对数据库运行查询以产生运行时错误.
我被赋予了在Heroku上托管的PostgreSQL 9.1数据库(我们可以称之为Master)之间编写ETL(提取,转换,加载)进程的任务,以及另一个用于应用程序的数据副本. Heroku(Cedar Stack)托管了PostgreSQL数据库.我们的主要开发堆栈是Python 2.7.2,Django 1.3.3和PostgreSQL 9.1.正如你们许多人所知,Heroku中的文件系统在你能做的事情上是有限的,我不确定我是否完全理解Ephemeral Filesystem的规则.
所以,我想弄清楚我的选择是什么.显而易见的是,我可以编写一个Django管理命令,并有两个独立的数据库连接(以及一组目标和源模型),并通过这种方式抽取数据并在此过程中处理ETL.虽然有效,但我的初步测试表明这是一种非常缓慢的方法.显然,更快的方法是使用PostreSQL COPY功能.但是,通常如果我这样做,我将能够将其写入文件,然后使用psql将其拉入.任何人在Heroku上的两个专用PostgreSQL数据库之间做了这样的事情吗?任何建议或提示将不胜感激.
我有一个在 postgres 中执行 plpgsql 函数的 cron 作业。此函数将零到多条记录插入表中。返回由函数创建的记录作为结果的最佳方法是什么?
我正在使用 PostgreSQL 9.1
我有一张桌子:
create table purchase(
transaction_id integer,
account_id bigint,
created timestamp with time zone,
price numeric(5,2)
)
Run Code Online (Sandbox Code Playgroud)
我认为我有一个系统向我发送重复记录的问题,但我不知道这个问题有多广泛.
我需要一个查询来选择在1秒内创建的所有记录(不一定是同一秒)具有相同的account_id和相同的价格.所以,例如,我希望能够找到这两个记录:
+----------------+----------------+-------------------------------+-------+
| transaction_id | account_id | created | price |
+----------------+----------------+-------------------------------+-------+
| 85239 | 80012340116730 | 2014-05-07 15:46:03.361959+00 | 8.47 |
| 85240 | 80012340116730 | 2014-05-07 15:46:04.118911+00 | 8.47 |
+----------------+----------------+-------------------------------+-------+
Run Code Online (Sandbox Code Playgroud)
如何在单个查询中执行此操作?
我正在使用PostgreSQL 9.3.
我在 PostgreSQL 9.2 数据库中的多个表上有一个审计触发器。作为参考,它基于此wiki页面。它记录作为其一部分运行的 client_query。当我手动运行针对生产的查询时,我总是在查询顶部添加一条注释,其中包含我的姓名缩写、我这样做的原因以及我想要完成的任务。例如:
--DS: Per email from xxxx, moving account from customer yyyy to zzzz
update account set cust_id = zzzz where cust_id = yyyy;
Run Code Online (Sandbox Code Playgroud)
使用 pgAdminIII 时效果很好。但是,如果我使用 PSQL,我不知道如何让它工作。如果我用--它开始一个查询,那么在按下下一行时按下回车键时就会忽略它。有趣的是,它甚至没有将其添加到历史记录中(当您“向上箭头”时不存在。
我想我可以把它放在底部,但这不是我的常态。关于如何强制执行此操作有什么建议吗?
注意:虽然很小,但很烦人。我很想知道解决方法。
postgresql ×4
python ×3
django ×2
heroku ×2
sql ×2
file-io ×1
flask ×1
mocking ×1
pg-dump ×1
pip ×1
plpgsql ×1
psql ×1
sql-insert ×1
sqlalchemy ×1
upsert ×1