【问题标题】:How to recognise a sqlite database created with sqlalchemy using pydal?如何识别使用 pydal 使用 sqlalchemy 创建的 sqlite 数据库?
【发布时间】:2019-02-02 13:41:29
【问题描述】:

我用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 reference 阅读它。

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 访问表?

谢谢

【问题讨论】:

    标签: python sqlite sqlalchemy web2py pydal


    【解决方案1】:

    首先,不要设置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 字段是一个自动递增整数主键字段。

    【讨论】:

    • 谢谢你。回答问题。我想一件事是我不完全理解 .table 文件的作用。看来我可以在没有 migrate=False 的情况下很好地使用这张桌子
    • 当 pyDAL 运行迁移(创建表、更改表)时,它会将一些元数据添加到关联的 *.table 文件中,以维护数据库中当前模式的记录(因此它可以确定未来如果您对模型定义进行更改,则运行迁移)。如果您不希望 pyDAL 管理迁移(即在您更改模型定义时自动更改数据库架构),那么您可以离开 migrate=False 并且不需要 *.table 文件。
    猜你喜欢
    • 2020-12-21
    • 2021-05-25
    • 2019-07-10
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多