application_name
是PostgreSQL特定连接参数,其中每个客户端可以(也应该)连接时设定。 后来在帮助DBA和操作人员用的应用程序代码的特定位关联行为不端的查询。
这太问题解释了如何设置application_name
使用SQLAlchemy的 ,但不幸的是,它并没有在Heroku上工作,因为设置application_name
是在PostgreSQL的增加8.5
分支(这是唯一的释放9.0
),而版本的PostgreSQL客户端库( libpq
)安装在Heroku的DYNOS从PostgreSQL的8.4.9建立。
什么,如果有的话,可以做,以设置application_name
在Heroku?
据我所知, 唯一的解决办法是厂商的一个新版本libpq
到您的蛞蝓。
我针对这些软件包libpq5和的libpq-dev的 ,从源码包构建的PostgreSQL-9.1 。 为了节省自己大量的工作 ,如果你相信我的二进制文件,你可以跳到步骤8,并使用我所做的预构建的二进制的libpq。 不,不,不用谢我。
- 旋转了一个新的VM香草12.04
-
sudo apt-get update
-
apt-get source postgresql-9.1
(你可能会需要sudo apt-get install dpkg-src
第一) - 在提取来源,看看规则文件(
postgresql-9.1-9.1.8/debian/rules
,如果precise-updates
仍处于PostgreSQL的9.1.8)。 从规则文件,我认为,我们应该建立我们的libpq使用的配置选项包括:
LDFLAGS="-Wl,--as-needed -Wl,-z,now" \ CFLAGS="-fPIC -DLINUX_OOM_ADJ=0" \ ./configure --prefix=/app/vendor \ --enable-integer-datetimes \ --enable-thread-safety \ --enable-debug \ --disable-rpath \ --with-gnu-ld \ --with-pgport=5432 \ --with-system-tzdata=/usr/share/zoneinfo \ --without-tcl \ --without-perl \ --without-python \ --with-krb5 \ --with-gssapi \ --with-openssl \ --with-libxml \ --with-libxslt \ --with-ldap
请注意,我删除/否定--enable-nls --with-ossp-uuid --with-tcl --with-perl --without-python --with-pam
,因为Heroku的赛道它们会导致配置/编译失败。 我不需要任何人,我不知道他们是否会影响libpq5
可言,我怀疑他们是非常需要在测功机,如果你觉得不然,有乐趣固定这一点,我的帽子的关闭对你的好先生。
make && make install
现在,所有的PostgreSQL安装到/vendor
。 我们需要采取的文件中指定postgresql-9.1-9.1.8/debian/libpq5.install
和postgresql-9.1-9.1.8/debian/libpq-dev.install
。 唉,因为我们没有关注Debian的安装布局,我们需要适应这些列表找到我们真正需要的文件。 我想出了这个名单:
tar c \ include/postgresql/internal/* \ include/libpq-fe.h \ include/libpq-events.h \ include/libpq/libpq-fs.h \ include/pg_config*.h \ include/postgres_ext.h \ include/postgresql/9.1/server/catalog/pg_type.h \ include/postgresql/9.1/server/catalog/genbki.h \ include/postgresql/9.1/server/nodes/nodes.h \ include/postgresql/9.1/server/utils/elog.h \ include/postgresql/9.1/server/utils/errcodes.h \ include/postgresql/9.1/server/utils/palloc.h \ include/postgresql/9.1/server/ch \ include/postgresql/9.1/server/pg_config.h \ include/postgresql/9.1/server/pg_config_manual.h \ include/postgresql/9.1/server/pg_config_os.h \ include/postgresql/9.1/server/port.h \ include/postgresql/9.1/server/pg_trace.h \ include/postgresql/9.1/server/postgres.h \ include/postgresql/9.1/server/postgres_fe.h \ include/postgresql/9.1/server/postgres_ext.h \ include/postgresql/9.1/server/mb/pg_wchar.h \ lib/libpq.so \ bin/pg_config \ lib/libpq.so.5* \ | gzip --best > /tmp/libpq-5.4_9.1.8.tar.gz
请注意,我不得不删除手册页( pg_config.1.gz
)和本地化消息( LC_MESSAGES/pg_config-9.1.mo LC_MESSAGES/libpq*.mo
下share/locale
),其中,出于某种原因,并没有建立在我的赛道。 我设法联系Python的psycopg2
针对此文件列表,并成功地使用它,但你可以算出来,并修复它,以及如果你觉得这是非常重要的。
我们的麻烦实际上是结束了。 你应该承担由此产生libpq-5.4_9.1.8.tar.gz
文件,并把它的地方,这将是通俗易懂你的测功机的buildpack(如S3),然后将其供应商到蛞蝓。 如果你不知道该怎么做,我的建议(当前的Python buildpack ),是你创建你塞文件“斌/ pre_compile”,并把这个到它:
#!/bin/sh vendor() { printf " " echo -n "$1 " curl --location --fail --silent $1 | tar -zx -C vendor && echo OK } echo " (lines by the app will be prefixed with ---->>)" echo "---->> Fetching vendored binaries" mkdir -p vendor vendor "http://fusic.s3.amazonaws.com/executables/heroku/libpq-5.4_9.1.8.tar.gz" echo "---->> Injecting shell environment" # Even though Heroku's Python buildback has a hook mechanism, hooks can't # change the buildpack's process environment (they are spawned, not # sourced). This makes it possible to write hooks in any language, but # makes vendoring stuff that should be linked against libraries installed # during the rest of the build process harder. The kludge below hijacks # $BIN_DIR/steps/pylibmc, which is sourced after this code and before pip # is ran. Puked a little in my mouth. # See also: https://twitter.com/aknin/status/290832546260979712 cat > $BIN_DIR/steps/pylibmc << EOF echo "---->> Injected environment hook executing" source .profile.d/activate_vendor_tree.sh EOF
并创建.profile.d/activate_vendor_tree.sh
,并把这个到它:
#!sh export PATH="/app/vendor/bin:$PATH" export CFLAGS="-I/app/vendor/include" export LDFLAGS="-L/app/vendor/lib -R/app/vendor/lib" export LD_LIBRARY_PATH="/app/vendor/lib:$LD_LIBRARY_PATH"
当编译您的蛞蝓,我们在安装踢预挂钩,下载我们的回迁的libpq和IT厂商到塞。 如果你正在使用Python buildpack或类似的限制buildpack(见上面详细的评论),在丑陋的,但必要的环境射出勾踢,你的要求,将针对新的libpq编译。 当你运行你的应用程序,方便的Heroku源一切.profile.d
执行你的代码,再次激活新的libpq之前。 哦耶。
终于,大功告成。 部署应用程序的Heroku来,和你的依赖应该针对新的libpq链接。 如果您的应用程序已完成部署,您可能需要清除蛞蝓的缓存目录之前Heroku的蛞蝓编译器将尝试重新安装这些要求(这样它们可以连接到您的新的libpq,这是一个棘手的话题,这是范围之外本教程的,我知道的唯一方法是要坚持的东西在pre_compile
将删除缓存)。 啊。