如何使用pydal识别使用sqlalchemy创建的sqlite数据库?

时间:2018-08-28 02:05:46

标签: python sqlite sqlalchemy web2py 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访问表?

谢谢

1 个答案:

答案 0 :(得分:2)

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