Как распознать базу данных sqlite, созданную с помощью sqlalchemy, используя pydal? - PullRequest
0 голосов
/ 28 августа 2018

Я создаю очень простую базу данных с sqlalchemy следующим образом:

from sqlalchemy import Column, Integer, String                                                                                                                                           
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine

from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class Person(Base): 
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)

engine = create_engine('sqlite:///sqlalchemy_example.db')

# Create all tables in the engine. This is equivalent to "Create Table"
# statements in raw SQL.
Base.metadata.create_all(engine)

Base.metadata.bind = engine

DBSession = sessionmaker(bind=engine)
session = DBSession()

# Insert a Person in the person table
new_person = Person(name='new person')
session.add(new_person)
session.commit()

и затем я попытался прочитать его, используя pyDAL ссылка .

from pydal import DAL, Field
db = DAL('sqlite://sqlalchemy_example.db', auto_import=True)
db.tables
>> []
db.define_table('person', Field('name'))
>> OperationalError: table "person" already exists

Как получить доступ к таблице с помощью pyDAL?

спасибо

1 Ответ

0 голосов
/ 28 августа 2018

Во-первых, не устанавливайте auto_import=True, так как это актуально только в том случае, если для таблиц существуют файлы метаданных переноса pyDAL * .table, что здесь не будет.

Во-вторых, pyDAL не знает, что таблица уже существует, и, поскольку миграции включены по умолчанию, он пытается создать таблицу. Чтобы предотвратить это, вы можете просто отключить миграцию:

# Applies to all tables.
db = DAL('sqlite://sqlalchemy_example.db', migrate_enabled=False)

или

# Applies to this table only.
db.define_table('person', Field('name'), migrate=False)

Если вы хотите, чтобы pyDAL перенял миграции для будущих изменений в этой таблице, вам следует запустить «поддельную миграцию», которая заставит pyDAL сгенерировать файл метаданных миграции * .table для этой таблицы без фактического запуска миграции. , Для этого временно сделайте следующее изменение:

db.define_table('person', Field('name'), fake_migrate=True)

После того, как все вышеперечисленное оставлено на месте для одного запроса, будет создан файл * .table, и вы можете удалить аргумент fake_migrate=True.

Наконец, обратите внимание, что pyDAL ожидает, что поле id будет целочисленным полем первичного ключа с автоинкрементом .

...