相关疑难解决方法(0)

在sqlalchemy中交叉数据库加入

SQLAlchemy中有没有办法进行跨数据库连接.具体来说,这是我的用例:

架构

  1. db1.entity1
    1. entity1_id:主键
    2. entity2_id:db2.entity2.entity2_id的外键
  2. db2.entity2
    1. entity2_id:主键

模型

我正在为模型使用声明式样式.

class Entity1(Base):
  __tablename__ = 'entity1' ## I tried combination of <db>.<table> with no success
  entity1_id = Column(Integer, primary_key=True)
  entity2_id = Column(Integer, ForeignKey('db2.entity2.entity2_id'))
  entity2 = relationship('Entity2')

class Entity2(Base):
  __tablename__ = 'entity2' ## I tried combination of <db>.<table> with no success
  entity2_id = Column(Integer, primary_key=True)
Run Code Online (Sandbox Code Playgroud)

现在,正如预期的那样,我对Entity1的查询失败,并显示MySQL错误消息,表示找不到表entity2.我尝试了许多不同的组合但__tablename__没有成功.所以我想知道SQLAlchemy是否可行.

python sqlalchemy flask-sqlalchemy

16
推荐指数
1
解决办法
6968
查看次数

主数据库中的外键引用附加数据库

在SQLite3中,有什么方法可以在主数据库中具有引用附加数据库中列的外键(反之亦然?)

我希望在多个进程之间共享附加的(只读)数据库,每个进程都有自己的(读/写)主数据库。

我这样创建父表(在数据库“ ParentDB”中):

create table Parent (id integer primary key);
Run Code Online (Sandbox Code Playgroud)

现在,我在主数据库中尝试此操作:

attach 'parent.sqlite3' as ParentDB;
create table Child (id integer not null references Parent (id),
                    constraint PK_Child primary key (id));
insert into ParentDB.Parent (id) values (42);
Run Code Online (Sandbox Code Playgroud)

当我尝试它时,它将创建没有错误的外键。现在,我尝试在子表中插入一行:

insert into Child (id) values (42);
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

Error: no such table: main.Parent
Run Code Online (Sandbox Code Playgroud)

因此,似乎总是假定父表和子表属于同一数据库。

同样,外键语法也不允许您指定父表所属的数据库

有解决方法吗?


这个问题是相关的,但是这里的父表和子表都在同一个附加数据库中,而我却在单独的数据库中。

sqlite foreign-keys

6
推荐指数
1
解决办法
1667
查看次数

Sqlalchemy可以很好地处理多个附加的SQLite数据库文件吗?

可以使用"ATTACH"语句将多个SQLite数据库连接在一起,并共同使用它们.可以使用特定于架构/文件的关键字引用每个SQLite文件中的表.这应该允许您通过文件范围来同时处理具有相同名称的多个表.我经历了一个关于如何做到这一点的非常好的教程:

http://longweekendmobile.com/2010/05/29/how-to-attach-multiple-sqlite-databases-together/

看起来我应该能够使用SQLAlchemy的表'schema'关键字来区分多个文件的连接.当我寻找一种方法来使用SQLAlchemy和通过ATTACH连接的SQLite数据库时,这是我找到的唯一例子.不幸的是,它已过时,似乎不适用于当前版本.

https://groups.google.com/forum/#!topic/sqlalchemy/QXqs4M2MjbY

我尝试使用Declarative类等更新该示例.这是我的尝试:

from sqlalchemy import *
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import *
#from sqlalchemy.pool import SingletonThreadPool

metadata = MetaData(object)
DeclarativeBase = declarative_base(metadata=metadata)

##########################################################################
# Classes
##########################################################################

class A(DeclarativeBase):
    __table__              = Table('A', DeclarativeBase.metadata,
                                   Column('id', Integer, primary_key=True, index=True, autoincrement=True),
                                   Column('col_a', Integer, index=True))

class B(DeclarativeBase):
    __table__              = Table('B', DeclarativeBase.metadata,
                                   Column('id', Integer, primary_key=True, index=True, autoincrement=True),
                                   Column('col_b', Integer, index=True),
                                   schema='database_b')

#engine = create_engine('sqlite:////tmp/database_a.sqlite',echo=True, poolclass=SingletonThreadPool)
engine = create_engine('sqlite:////tmp/database_a.sqlite',echo=True)
db     = engine.connect()
db.execute("ATTACH DATABASE '/tmp/database_b.sqlite' AS database_b")

DeclarativeBase.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session …
Run Code Online (Sandbox Code Playgroud)

python sqlite postgresql sqlalchemy

6
推荐指数
1
解决办法
2191
查看次数