Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nối các bảng trong hai cơ sở dữ liệu bằng SQLAlchemy

Trong MySQL, cơ sở dữ liệu đồng nghĩa với lược đồ . Ví dụ, trong Postgresql, bạn có thể truy vấn giữa nhiều lược đồ trong cơ sở dữ liệu, nhưng không phải giữa các cơ sở dữ liệu (trực tiếp), bạn có thể truy vấn giữa nhiều cơ sở dữ liệu trong MySQL vì không có sự phân biệt giữa hai cơ sở dữ liệu.

Trong trường hợp này, một giải pháp khả thi cho truy vấn đa cơ sở dữ liệu của bạn trong MySQL có thể là sử dụng một công cụ, phiên và Cơ sở xử lý cả hai lược đồ của bạn và chuyển schema đối số từ khóa vào bảng của bạn hoặc phản ánh cả hai lược đồ để chúng hoàn toàn đủ điều kiện.

Vì tôi không có dữ liệu của bạn nên tôi đã tạo 2 lược đồ (cơ sở dữ liệu MySQL) trên một máy chủ thử nghiệm có tên sopython và sopython2:

mysql> create database sopython;
Query OK, 1 row affected (0,00 sec)

mysql> create database sopython2;
Query OK, 1 row affected (0,00 sec)

và thêm một bảng trong mỗi:

mysql> use sopython
Database changed
mysql> create table foo (foo_id integer not null auto_increment primary key, name text);
Query OK, 0 rows affected (0,05 sec)

mysql> insert into foo (name) values ('heh');
Query OK, 1 row affected (0,01 sec)

mysql> use sopython2
Database changed
mysql> create table bar (bar_id integer not null auto_increment primary key, foo_id integer, foreign key (foo_id) references `sopython`.`foo` (foo_id)) engine=InnoDB;
Query OK, 0 rows affected (0,07 sec)

mysql> insert into bar (foo_id) values (1);
Query OK, 1 row affected (0,01 sec)

Trong Python:

In [1]: from sqlalchemy import create_engine

In [2]: from sqlalchemy.orm import sessionmaker

In [3]: from sqlalchemy.ext.automap import automap_base

In [4]: Session = sessionmaker()

In [5]: Base = automap_base()

Tạo công cụ mà không chỉ định lược đồ (cơ sở dữ liệu) bạn sử dụng theo mặc định:

In [6]: engine = create_engine('mysql+pymysql://user:[email protected]:6603/')

In [7]: Base.prepare(engine, reflect=True, schema='sopython')

In [8]: Base.prepare(engine, reflect=True, schema='sopython2')
/home/user/SO/lib/python3.5/site-packages/sqlalchemy/ext/declarative/clsregistry.py:120: SAWarning: This declarative base already contains a class with the same class name and module name as sqlalchemy.ext.automap.foo, and will be replaced in the string-lookup table.
  item.__name__

Cảnh báo là điều tôi không hiểu đầy đủ và có thể là kết quả của tham chiếu khóa ngoại giữa 2 bảng gây ra phản ánh lại foo, nhưng nó có vẻ không gây ra sự cố.

Cảnh báo là kết quả của lần gọi thứ hai tới prepare() tạo lại và thay thế các lớp cho các bảng được phản ánh trong lần gọi đầu tiên. Cách để tránh tất cả những điều đó là trước tiên hãy phản ánh các bảng từ cả hai lược đồ bằng cách sử dụng siêu dữ liệu, sau đó chuẩn bị:

Base.metadata.reflect(engine, schema='sopython')
Base.metadata.reflect(engine, schema='sopython2')
Base.prepare()

Sau tất cả điều này, bạn có thể truy vấn tham gia foo và bar:

In [9]: Base.metadata.bind = engine

In [10]: session = Session()

In [11]: query = session.query(Base.classes.bar).\
    ...:     join(Base.classes.foo).\
    ...:     filter(Base.classes.foo.name == 'heh')

In [12]: print(query)
SELECT sopython2.bar.bar_id AS sopython2_bar_bar_id, sopython2.bar.foo_id AS sopython2_bar_foo_id 
FROM sopython2.bar INNER JOIN sopython.foo ON sopython.foo.foo_id = sopython2.bar.foo_id 
WHERE sopython.foo.name = %(name_1)s

In [13]: query.all()
Out[13]: [<sqlalchemy.ext.automap.bar at 0x7ff1ed7eee10>]

In [14]: _[0]
Out[14]: <sqlalchemy.ext.automap.bar at 0x7ff1ed7eee10>

In [15]: _.foo
Out[15]: <sqlalchemy.ext.automap.foo at 0x7ff1ed7f09b0>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có phải “Where IN” với nhiều cột được xác định trong SQL chuẩn không?

  2. Ngày hệ thống đặt chỗ

  3. tránh Sắp xếp theo Từ khóa MYSQL IN

  4. MySQL thêm cột nếu không tồn tại

  5. Bảng được chỉ định hai lần, vừa là mục tiêu cho 'CẬP NHẬT' và là nguồn riêng cho dữ liệu trong mysql