С peewee, как подключиться к существующей базе данных SQLite только для чтения - PullRequest
0 голосов
/ 07 мая 2018

У меня глупый вопрос.

Это мой код:

  from peewee import *

   db = SqliteDatabase(None)

   class Base(Model):
       class Meta:
           database = db

   class Table(Base):
       a_date = DateField()
       url = CharField()

   def __main()__
       parser = argparse.ArgumentParser()
       parser.add_argument('--db-dir', action='store')
       args = parser.parse_args()
       db_path = os.path.join(args.db_dir, 'data.db')
       try:
           db.init(db_path)
           db.connect()
           query = Table.select().order_by(Table.a_date.desc()).get()   
       except Exception:
           sys.exit(1)
       else:
           print(query.url)

       sys.exit(0)


   if __name__ == '__main__':
       main()

Этот код работает нормально, но если файл db не существует, db.connect всегда создает его. Как я могу предотвратить это?

Другой вопрос: как можно запросить базу данных таблицы для этого поля без объявления модели peewee?

Спасибо

1 Ответ

0 голосов
/ 07 мая 2018

Если я правильно понимаю peewee doc (http://docs.peewee -orm.com / ru / latest / peewee / database.html ), они используют API, предоставленный python, для подключения к sqlite.

Это означает, что вы должны иметь дело с этим API (https://docs.python.org/2/library/sqlite3.html#sqlite3.connect), и метод подключения всегда создает базу данных заранее.

Я, однако, считаю, что вы можете передать пользовательский класс Connection этому методу (фабрика параметров), вы можете определить свое поведение в этом пользовательском классе.

import os

from sqlite3 import Connection
from peewee import *

class CustomConnection(Connection):
    def __init__(self, dbname, *args, **kwargs):
        # Check if db already exists or not
        if not os.path.exists(dbname):
            raise ValueError('DB {} does not exist'.format(dbname))
        super(CustomConnection, self).__init__(dbname, *args, **kwargs)

db = SqliteDatabase('mydatabase', factory=CustomConnection)
...