PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Obsługa schematów Postgres przez SQLAlchemy

Cóż, można to zrobić na kilka sposobów i zależy to od struktury Twojej aplikacji. Oto najbardziej podstawowy sposób:

meta = MetaData(schema="client1")

Jeśli sposób, w jaki Twoja aplikacja działa, to jeden „klient” na raz w całej aplikacji, gotowe.

Ale to, co może być w tym nie tak, to to, że każda tabela z tych metadanych znajduje się w tym schemacie. Jeśli chcesz, aby jedna aplikacja obsługiwała jednocześnie wielu klientów (zwykle co oznacza „wielodostępny”), byłoby to nieporęczne, ponieważ musiałbyś utworzyć kopię MetaData i skopiować wszystkie mapowania dla każdego klienta. Takie podejście można wykonać, jeśli naprawdę chcesz, sposób, w jaki działa, to dostęp do każdego klienta za pomocą określonej zmapowanej klasy, takiej jak:

client1_foo = Client1Foo()

w takim przypadku pracowałbyś z przepisem „nazwa encji” na http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName w połączeniu z sometable.tometadata() (patrz http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).

Załóżmy więc, że tak naprawdę działa wielu klientów w aplikacji, ale tylko jeden na wątek. Właściwie najłatwiejszym sposobem na zrobienie tego w Postgresql byłoby ustawienie ścieżki wyszukiwania, gdy zaczynasz pracę z połączeniem:

# start request

# new session
sess = Session()

# set the search path
sess.execute("SET search_path TO client1")

# do stuff with session

# close it.  if you're using connection pooling, the
# search path is still set up there, so you might want to 
# revert it first
sess.close()

Ostatecznym podejściem byłoby nadpisanie kompilatora za pomocą rozszerzenia @compiles, aby umieścić nazwę „schematu” w instrukcjach. Jest to wykonalne, ale byłoby to trudne, ponieważ nie ma spójnego haka dla każdego miejsca, w którym generowana jest „Tabela”. Najlepszym rozwiązaniem jest prawdopodobnie ustawienie ścieżki wyszukiwania dla każdego żądania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przechowywanie strefy czasowej w znaczniku czasu typu danych ze strefą czasową

  2. fe_sendauth:nie podano hasła

  3. Jak zainstalować libpq-fe.h?

  4. zbuduj dynamiczne zapytanie SQL za pomocą biblioteki psycopg2 python i używając dobrych narzędzi do konwersji

  5. Aktualizacja bazy danych do PostgreSQL w wersji 10 — co powinieneś wiedzieć