sqlalchemy.exc.NoForeignKeysError: Can’t find any foreign key relationships

Pyramidのわだい。
SQLAlchemyがいじわるな子になっている件。
掲題のエラーが出るんですよ。

全体感としては、
models.mymodel.pyの中で

Base = declarative_base()
MyModel(Base)

こう。MyModelクラスを切っておき、他のファイルの各モデルクラスがMyModelを継承するというかんじ。
models.employee.pyには

class Employee(MyModel):

こういうのがいますという形。
なんてことないというか、以前これで普通に使えていたはずなんだけどナーというところですが
sqlalchemy.exc.NoForeignKeysError: Can’t find any foreign key relationships between ‘models’ and ‘employee’.

むむむ。なんだよ。リレーションなんて張らないよ。継承元でしかないんだけどどういうことなの。

手当たり次第にぐぐります。

そして発見

if you want your NewBase to be a descendant of Base, then you’d need to put __abstract__=True on it. But if these cols are global to everyone you could make it the superclass of your declarative Base also by passing it as “class_” to declarative_base().
the naming conventions recipe is another way to go too.

新しいBase(たぶんdeclarative_baseのことなんだろう)を使うときは、__abstract__を使ってみてとある。
なんすかそれは。
入れてみますと、これが当たりでした。

こうするとよいということですね。

class MyModel(Base):
    __tablename__ = 'models'
    __abstract__=True
    id       = Column(Integer, primary_key=True)
    status   = Column(Integer, default=1)
    created  = Column(DateTime, default=datetime.datetime.now)
    updated  = Column(DateTime, default=datetime.datetime.now)

    def __init__(self, name, value):
        self.name = name

あ、えーとPEP8違反(=の両脇にスペースたくさん入れるのNG)の記述になってます。すいません。
PyCharmもあまりにこれガミガミ言うんで警告出さないようにしちゃった。すいません。
=の位置が揃ってないと気持ち悪いんだよ。

pip install umysqldbからのerror: command ‘gcc’ failed with exit status 1

あとで自分が検索できるようにと、エラーメッセージそのものをタイトルにしちゃっています。
重宝します。

経緯はともかく解決方法

aptitude install python-dev

うわあ。
身も蓋もなかったなあ。
gccがどうだのって言われて怯んでたんですけどね。

んで

pip install MySQL-Python

おわり。

よくは知りませんが、PythonのモジュールMySQLdbとかいうのはは死に体なのか、uMySQLdbってモジュールがPyPiでは人気あるようです。スコアが高いのね。
あたしは呼べればなんでもいいですが、カッコつけてコンパイルとかしといて、結局aptさんに入れてもらって解決とか意味がわからない。
あー
コンパイルオプションなんか忘れたのかもしれないなあ。

そしてfuelphpやるかとおもいきやpyramidでセットアップ

phpめんどくさいよ。仕事で使って、なんで要件好きに決められる自分のプロジェクトでも自らphp選択するんだよ。いみがわからない。
ということで、前の記事でphpをアレしてたのは一旦放っておき、愛するPyramidの環境をつくろうと思う。
Nginx+Python+Mysql、Pyramid+Jinja2。個人的にはmaaDBはなんでもいいですけどこの構成が好きです。
まともにアプリ書き終えるとこまで行ったことないですけどね。

pcreateでざざっと作ったあとで思い出す。
昔の記事で、このへんの構成を好みで動かしたやつがあった気がする。プロジェクトテンプレートを作っておけばよかった。手作業はまたディレクトリ指定間違えたりする凡ミスの温床なのよ。

(解決済)やりたいことを整理しよう(VMとNginxとサブドメイン編)

ローカルPCにVirtualBox立てて、そこにDebian+Nginx+php|Pytonが入ってます。
DBは別のVirtualBoxでまた立ててます。一緒にしないのは雰囲気の問題です。
Debianなのはロゴの趣味です。

ローカル

hostsに

192.168.56.110	hoge.wev_dev

Nginx

で、Nginxには

    server {
        listen       80;
        server_name  hoge.wev_dev;
        #access_log  logs/host.access.log  main;
        location / {
            proxy_pass  http://localhost:9000;
            root   /home/nginx/hoge/public;
            index  index.php index.html;
        }
        location ~ \.php$ {
            root           /home/nginx/hoge/public;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/nginx/hoge/public$fastcgi_script_name;
            include        fastcgi_params;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ /\.ht {
            deny  all;
        }
    }

だいたいこんな感じ。ほんとはhoge.wev_devみたいな感じで見に行きたいんだけどうまくいかない。

いじってるうちに足元見失いがちなので作業ログとして書いとく。
みなさんこの通りに書いたって何にも動きませんよ。解決したら解決編は書く。

解決編

いったん記事公開したあとで引っ込めるのはアレなので恥の上塗りだが追記。つらい。
ドキュメントルートのディレクトリ間違ってただけだった何年webやってんすか。
いろいろ調整したあと、だいたいこんなかんじ。

    server {
        listen       8301;
        server_name  localhost;
        #access_log  logs/host.access.log  main;
        location / {
            #proxy_pass  http://localhost:9000;
            root   /home/nginx/www/hoge/public;
            index  index.php index.html;
            if (-f $request_filename) {
                break;
            }
            if (!-e $request_filename) {
                rewrite ^(.+)$ /index.php?q=$1 last;
            }
        }
        location ~ \.php$ {
            root           /home/nginx/www/hoge/public;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/nginx/www/hoge/public$fastcgi_script_name;
            include        fastcgi_params;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ /\.ht {
            deny  all;
        }
    }

じぶんでディレクトリ掘って置きながらそれを忘れ、出ないでないと騒ぐのはもうすでに病気かなんかじゃないのか。凹むわ。
ディレクトリには気をつけよう!ね!

channel 2: open failed: connect failed: Connection refused

ポートフォワードというのがたまに便利なので、自宅でもいろいろ試し中

ローカルのPCから、VirtualBox上にアレしたDebianにアレして、
ssh -C -L 10201:localhost:8080 hogeuser@192.168.56.110

こんな塩梅に叩いて、ブラウザから
http://localhost:8080/

と叩くとVM上のNginxさんとこに見に行ってページが表示される・・・!つもりだったんだけど、
channel 2: open failed: connect failed: Connection refused

と言われてソレっきり。うまくいかない。

あららーまたなんかいろいろアレですよー
とっちらかった頭のままいろいろにとりかかっちゃって、状況を整頓できてない感もある。
いちおう困った状況にはなったので、行動ログとして置いとく。そのうち解決方法も見つかるだろ。

phpのmakeでコケる

ローカルにVirtualBoxアレして、サーバ作ってんの。
php5.5.8を入れたろうと思ってあれこれ中
ざくっとmake test

ext/standard/basic_functions.o: In function `zm_startup_basic’:
/tmp/php-5.5.8/ext/standard/basic_functions.c:3648: undefined reference to `zm_startup_password’
ext/standard/basic_functions.o:(.rodata+0xae0): undefined reference to `zif_password_hash’
ext/standard/basic_functions.o:(.rodata+0xaf4): undefined reference to `zif_password_get_info’
ext/standard/basic_functions.o:(.rodata+0xb08): undefined reference to `zif_password_needs_rehash’
ext/standard/basic_functions.o:(.rodata+0xb1c): undefined reference to `zif_password_verify’
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `SSL_CTX_use_certificate_chain_file@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `SSL_CTX_set_verify@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `ASN1_STRING_type@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `CRYPTO_free@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `SSL_get_shutdown@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `SSL_get_verify_result@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `d2i_PKCS12_fp@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `EVP_cleanup@OPENSSL_1.0.0′

もういやじゃー
なんなのじゃー

メモ:いまのとこのconfigure
./configure –with-mysql –enable-cgi –with-openssl –with-zlib –with-curl –with-config-file-path=/etc –enable-opcache=no

短い。
なーんかcurlとopensshで転ぶんだよなー。めんどくさい。

アカシアの皿

木の食器のやさしい、野暮ったい感じがすきです。
ヨメが金属のこすれる音を好まないこともあって、フォークやスプーンは木の製品を使っています。
で、皿とかも欲しいなと唸っていたところ、誕生日(17才になりました^^)に買ってもらえました。
カフェごはんとかによくある、ランチプレートみたいなやつ。
いやー休日のご飯とかはかどっちゃうよこれは。

(解決済)fuelphpセットアップ時に怒られる(Error – date_default_timezone_get(): It is not safe to rely on the system’s timezone settings.以下略)

タイトル長すぎか。まあいいか。
VPSに適当にphp5.5.8(mysql,openssl,enable-cgiが有効)を放り込み、fuelphpをセットアップしております。

oilでアプリケーションを生成するあたりで、最後に
php composer.phar update
こんなのやりますな。すると
Writing lock file
Generating autoload files
Error – date_default_timezone_get(): It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone ‘UTC’ for now, but please set date.timezone to select your timezone. in COREPATH/classes/fuel.php on line 161

はあ。
最初はたんにphp.iniがないんで怒られてたんですが、php.iniを設置し、date.timezoneの値をセットしてあげてもこの症状が変わらない。
どうもあちこち見た感じ、php.iniに書いても空で初期化されてphpが開始してしまっているみたいな感触。
ちなみに近くにある設定箇所の
;date.default_latitude = 31.7667
;date.default_longitude = 35.2333
;date.sunrise_zenith = 90.583333
;date.sunset_zenith = 90.583333

このへんは、コメントアウトされているにもかかわらずなんか値を保持している状態。
気持ち悪くてかなわない。

いささか消極的な解決法

なんだかfuel.phpで死んでるようなので、
fuel/core/classes/fuel.php
の先頭あたりに以下を記述。
date_default_timezone_set(“Asia/Tokyo”);

やだなあこういうの……。
嫌なのはまああれですが、怒られなくなったのでいったんこれで進めることに。
試し書きでphpinfoとか書いて上げるようなノリの一枚物でも、こういう処置を講じてあげないとだめなのかいな。めんどくさい。

根本的に解決しました

コメント欄参照というと簡単すぎですが、コンパイル時に指定されているphp.iniの位置に、ただしくphp.iniが置かれていないことが原因でした。
あたし/etc/php.iniにおいてたんだけど、phpinfo確認したら

Configuration File (php.ini) Path /usr/local/lib

とあるわけよ。
やんなっちゃうよね。
/usr/local/lib/php.ini
に設置しなおし、php-cgiの再起動(nginxから使うので)して解決。
お騒がせしました。