質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

uWSGI

uWSGIは、PythonでWebサービスを動かすアプリケーションサーバの一つです。WSGI(Web Server Gateway Interface)アプリケーションコンテナの一種で、WSGIに則ったDjangoやFlaskなどで動かすことができます。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

505閲覧

データベースファイルがサーバーのルートに出力されてしまう。pythonファイルと同じディレクトリに作成したい。

wozniac777

総合スコア1

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

uWSGI

uWSGIは、PythonでWebサービスを動かすアプリケーションサーバの一つです。WSGI(Web Server Gateway Interface)アプリケーションコンテナの一種で、WSGIに則ったDjangoやFlaskなどで動かすことができます。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/01/10 11:22

前提

conohaVPSサーバーで以下の構成になっています。
・CentOS Stream release 9
・Python 3.9.14
・sqlite3
・nginx version1.20.1
・uWSGI 2.0.21

実現したいこと

ローカル環境と同様にWebサーバー上でも、pythonファイルと同じディレクトリにデータベースを作成したい。

サーバーでのディレクトリ
サーバーのルート/ver/www/サイトのルートディレクトリ

/ver/www/サイトのディレクトリ/ここにデータベースファイルを作成したい

発生している問題

ローカル環境ではデータベースをmain.pyと同じディレクトリにデータベースが作成されます。しかし、同じファイルをVPSサーバーにアップロードし、実行すると、main.pyと同じディレクトリではなくサーバーのルートに.dbファイルが作られてしまいます

サーバーのルート(ここに.dbファイルが作られてしまう)/ver/www/サイトのルートディレクトリ

該当のソースコード

main.py

def __init__(self, db_name): self.db = getattr(g, '_database', None) if self.db is None: self.db = g._database = sqlite3.connect( 'データベース名.db') self.cur = self.db.cursor()

試したこと

ローカル上のファイルとサーバー上のファイルは同じコードなので、違いはサーバーだと思い、nginxやuWSGIのルート設定を書き込んでみましたが、データベースのつくられる場所は、サーバーのルートに作られてしまいます。

初めて、ネットで検索をしながら、VPSでPython環境を作りました。
かなり調べましたが、デフォルトではmain.pyと同じディレクトリに.dbファイルが作られるようです。何か設定ファイルが存在して、そこをいじってしまっているのでしょうか?

現状でも、Webアプリの作成は問題ないのですが、出来ればローカル上の環境と同じようにしたいと思っています。また、現状のままでは複数のドメインを作った時に同じデータベース名の場合は上書きされてしまう恐れもあります。かなり調べましたが解決できません。どなたかご教授いただけないでしょうか?よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/01/10 12:25

相対パスではなく、絶対パスで指定してみてはどうでしょうか。 sqlite3.connect('/var/www/サイトのディレクトリ/データベース名.db')
wozniac777

2023/01/10 12:37

これで解決しようか迷ったのですが、ローカルでうまくいかないだろうと思い断念しました。 もし、これで解決しようとしたら、ウェブかローカルかを判別してコードを切り替えなきゃいけなさそうで、ちょっと保留にしています。ウェブかローカルかを判別するコードは簡単ですか泣
melian

2023/01/10 12:48

そうでしたら以下の様にするとよいかと思います。実行時に __file__ がスクリプトファイルの絶対パスに置き換えられます。 sqlite3.connect(os.path.join(os.path.dirname(__file__), 'データベース名.db'))
wozniac777

2023/01/10 13:12

出来ました!!! melianさんをベストアンサーにしたいのですが、どうすればいいのでしょう?
wozniac777

2023/01/10 13:13

melianさん、本当にありがとうございました。 途方に暮れていたところ、あっという間に解決出来ました。
melian

2023/01/10 13:14

上手く行ってよかったです。それでは回答に転記します。
guest

回答2

0

ベストアンサー

※ コメントから転記

ウェブかローカルかを判別してコードを切り替えなきゃいけなさそうで、

そうでしたら以下の様にするとよいかと思います。実行時に __file__ がスクリプトファイルの絶対パスに置き換えられます。(絶対パスに置き換えられるのは Python 3.9 以降の挙動です)

python

1sqlite3.connect(os.path.join(os.path.dirname(__file__), 'データベース名.db'))

投稿2023/01/10 13:16

melian

総合スコア19749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

main.py のあるディレクトリで実行してますか? (カレントディレクトリ的に)

投稿2023/01/10 12:25

yuma.inaura

総合スコア1453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wozniac777

2023/01/10 12:40

早速の解答ありがとうございます。 いままで、PHPとwordpressを主に使ってきましたので、このような考えが浮かびませんでした! /opt/venv/bin/uwsgi --ini /var/www/フォルダ名/app_uwsgi.ini uWSGIの設定ファイルを読み込んで実行をしているようなのですが、設定ファイルに問題があるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問