16

Tôi đã xem qua tài liệu của Google Cloud SQL và các tìm kiếm khác nhau, nhưng tôi không thể tìm hiểu xem có thể sử dụng SQLAlchemy với Google Cloud SQL hay không và nếu có thì URI kết nối sẽ là gì.SQLAlchemy có thể được sử dụng với Google Cloud SQL không?

Tôi muốn sử dụng phần mở rộng Flask-SQLAlchemy và cần chuỗi kết nối như vậy: mysql://username:[email protected]/db

tôi thấy ví dụ Django, nhưng nó xuất hiện cấu hình sử dụng một phong cách khác nhau hơn so với chuỗi kết nối. https://developers.google.com/cloud-sql/docs/django

Google Cloud SQL tài liệu: https://developers.google.com/cloud-sql/docs/developers_guide_python

Trả lời

37

Cập nhật

Google Cloud SQL bây giờ hỗ trợ truy cập trực tiếp, do đó, phương ngữ MySQLdb hiện có thể được sử dụng. Kết nối đề nghị thông qua phương ngữ mysql đang sử dụng định dạng URL:

mysql+mysqldb://[email protected]/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename> 

mysql+gaerdbms đã bị phản đối SQLAlchemy kể từ phiên bản 1.0

Tôi đi đây là câu trả lời ban đầu dưới đây trong trường hợp người khác vẫn thấy nó hữu ích.


Đối với những người ghé thăm câu hỏi này sau (và không muốn đọc qua tất cả các bình luận), SQLAlchemy bây giờ hỗ trợ Google Cloud SQL như các phiên bản 0.7.8 bằng cách sử dụng chuỗi kết nối/phương ngữ (xem: docs):

mysql+gaerdbms:///<dbname> 

Ví dụ:

create_engine('mysql+gaerdbms:///mydb', connect_args={"instance":"myinstance"}) 

tôi đã đề xuất một update vào phương ngữ mysql+gaerdmbs:// để hỗ trợ cả API Google Cloud SQL (rdbms_apiproxyrdbms_googleapi) để kết nối với Cloud SQL từ phiên bản sản xuất không phải của Google App Engine (ví dụ: máy trạm phát triển của bạn).Thay đổi cũng sẽ sửa đổi chuỗi kết nối một chút bằng cách bao gồm dự án và cá thể như là một phần của chuỗi và không yêu cầu được chuyển riêng thông qua connect_args.

Ví dụ:

mysql+gaerdbms:///<dbname>?instance=<project:instance> 

Điều này cũng sẽ làm cho nó dễ dàng hơn để sử dụng đám mây SQL với Flask-SQLAlchemy hoặc mở rộng khác, nơi mà bạn không thực hiện một cách rõ ràng create_engine() gọi.

Nếu bạn gặp sự cố khi kết nối với Google Cloud SQL từ máy trạm phát triển của mình, bạn có thể muốn xem câu trả lời của tôi tại đây - https://stackoverflow.com/a/14287158/191902.

+3

FYI cho bất kỳ ai khác tình cờ gặp câu trả lời này: Phương pháp này không còn được đề xuất bởi SQLAlchemy; sử dụng phương ngữ MySQLdb thay vào đó: [doc link] (http://docs.sqlalchemy.org/en/latest/dialects/mysql.html?highlight=appengine#module-sqlalchemy.dialects.mysql.gaerdbms) – eaj

4

nó là doable, mặc dù tôi đã không sử dụng Flask ở tất cả vì vậy tôi không chắc chắn về việc thiết lập các kết nối thông qua đó. Tôi đã làm việc thông qua các Kim tự tháp và nộp một bản vá để SQLAlchemy (có thể đến repo sai) ở đây:

https://bitbucket.org/sqlalchemy/sqlalchemy/pull-request/2/added-a-dialect-for-google-app-engines

Đó từ đó đã được thay thế và chấp nhận vào SQLAlchemy như

http://www.sqlalchemy.org/trac/ticket/2484

tôi không nghĩ rằng nó đã được thực hiện theo cách đó để phát hành một mặc dù.

Có một số vấn đề với Google SQL ném các ngoại lệ khác nhau vì vậy chúng tôi gặp sự cố với những thứ như triển khai cơ sở dữ liệu tự động. Bạn cũng cần phải vô hiệu hóa kết nối tổng hợp bằng cách sử dụng NullPool như đã đề cập trong bản vá thứ hai.

Chúng tôi đã kể từ khi chuyển sang sử dụng kho dữ liệu thông qua NDB vì vậy tôi đã không theo progess của các bản sửa lỗi cho một thời gian ..

+0

bạn sẽ chia sẻ những lý do cho quyết định chuyển sang NDB? – van

+0

Về cơ bản, chúng tôi tin rằng nó phù hợp hơn với những gì chúng tôi đang làm. Chúng tôi bắt đầu sử dụng SQLAlchemy vì chúng tôi biết SQL/RDBMS và chúng tôi nghĩ rằng nó là ít nhất một trong những ORMS Python tốt nhất hiện có (sau một số nghiên cứu hạn chế). Nhưng cuối cùng sự phức tạp của việc ánh xạ một RDBMS tới các đối tượng trong mã của bạn dường như là một sự lãng phí công sức mà không có lý do thực sự tốt để đến đó khi bạn có thể lưu trữ trực tiếp các đối tượng đó vào kho dữ liệu không có sql. – lecstor

+0

Tôi đã xem xét việc sử dụng SQL cho một dự án có trọng tâm lớn về báo cáo, vì bản chất NoSQL của GAE DataStore (db/ndb) không dễ dàng làm việc mà không có rất nhiều sự bình thường hóa và giảm bản đồ. Nó sẽ là tuyệt vời nếu có một cái gì đó giống như Apache Hive cho GAE, nhưng tôi đang nhận ra chủ đề bây giờ. Tôi sẽ xem xét các changeset của vấn đề SQLAlchemy và đi từ đó. Tôi có thể truy cập lại bằng cách sử dụng DataStore và làm việc thông qua các biến chứng. Tôi biết nó chắc chắn có thể (tất cả các công trình của Google theo cách này), chỉ phức tạp hơn cho nhóm của chúng tôi. –

7

Có,

Nếu bạn tìm thấy bất kỳ lỗi nào trong SA + Cloud SQL, vui lòng cho tôi biết. Tôi đã viết mã phương ngữ đã được tích hợp vào SQLAlchemy. Có một chút kinh doanh ngớ ngẩn về cách Cloud SQL bong bóng ngoại lệ, vì vậy có thể có một số kết thúc lỏng lẻo ở đó.

0

Đối với những người thích PyMySQL qua MySQLdb (được đề xuất trong các câu trả lời được chấp nhận), các dây kết nối SQLAlchemy là:

Đối với sản xuất

mysql+pymysql://<USER>:<PASSWORD>@/<DATABASE_NAME>?unix_socket=/cloudsql/<PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>

Hãy chắc chắn để

  1. Thêm các tệp SQL tầm quan đến app.yaml của bạn:

    beta_settings: 
        cloud_sql_instances: <PUT-SQL-INSTANCE-CONNECTION-NAME-HERE> 
    
  2. Bật API SQL Quản trị as it seems to be necessary:

    https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview

Đối với phát triển địa phương

mysql+pymysql://<USER>:<PASSWORD>@localhost:3306/<DATABASE_NAME>

cho rằng bạn bắt đầu Cloud SQL Proxy với:

cloud_sql_proxy -instances=<PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>=tcp:3306

Các vấn đề liên quan