如何识别使用 pydal 使用 sqlalchemy 创建的 sqlite 数据库?
How to recognise a sqlite database created with sqlalchemy using pydal?
我用 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 访问 table?
谢谢
首先,不要设置 auto_import=True
,因为只有当 pyDAL *.table 迁移元数据文件存在于 table 时才相关,这里不会是这种情况.
其次,pyDAL 不知道 table 已经存在,并且由于默认情况下启用迁移,它会尝试创建 table。为防止这种情况,您可以简单地禁用迁移:
# 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 接管迁移以便将来对此 table 进行更改,那么您应该 运行 一个 "fake migration",这将导致 pyDAL 生成一个 *.table 此 table 的迁移元数据文件,实际上没有 运行 迁移。为此,暂时进行以下更改:
db.define_table('person', Field('name'), fake_migrate=True)
在为单个请求保留上述内容后,将生成 *.table 文件,您可以删除 fake_migrate=True
参数。
最后,请注意 pyDAL 期望 id
字段是一个 自动递增 整数主键字段。
我用 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 访问 table?
谢谢
首先,不要设置 auto_import=True
,因为只有当 pyDAL *.table 迁移元数据文件存在于 table 时才相关,这里不会是这种情况.
其次,pyDAL 不知道 table 已经存在,并且由于默认情况下启用迁移,它会尝试创建 table。为防止这种情况,您可以简单地禁用迁移:
# 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 接管迁移以便将来对此 table 进行更改,那么您应该 运行 一个 "fake migration",这将导致 pyDAL 生成一个 *.table 此 table 的迁移元数据文件,实际上没有 运行 迁移。为此,暂时进行以下更改:
db.define_table('person', Field('name'), fake_migrate=True)
在为单个请求保留上述内容后,将生成 *.table 文件,您可以删除 fake_migrate=True
参数。
最后,请注意 pyDAL 期望 id
字段是一个 自动递增 整数主键字段。