SQLAlchemy为定义数据库表提供了一个非常干净的接口:
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
user = Table('user', metadata,
Column('user_id', Integer, primary_key = True),
Column('user_name', String(16), nullable = False),
Column('email_address', String(60), key='email'),
Column('password', String(20), nullable = False)
)
user_prefs = Table('user_prefs', metadata,
Column('pref_id', Integer, primary_key=True),
Column('user_id', Integer, ForeignKey("user.user_id"), nullable=False),
Column('pref_name', String(40), nullable=False),
Column('pref_value', String(100))
)
Run Code Online (Sandbox Code Playgroud)
一旦定义了这些表,就可以很容易地使用该metadata.create_all(engine)
函数创建这些表.当您想要创建不会干扰生产中使用的现有表的表时,这对于测试尤其有用.
我目前正在开发的项目在很大程度上依赖于postgres中的用户定义函数.有没有一种干净的方法来使用SQLAlchemy定义这些函数,以便metadata.create_all(engine)
正确地创建函数以及相应的表?
我有一个外国表,例如:
CREATE FOREIGN TABLE film (
id varchar(40) NOT NULL,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
)
SERVER film_server;
Run Code Online (Sandbox Code Playgroud)
ID为该表的主键(在远程数据库中设置)。我想让本地表引用外表,并在本地表上设置外键约束-例如:
CREATE TABLE actor (
id varchar(40) NOT NULL,
name varchar(40) NOT NULL,
film_id varchar(40) NOT NULL,
)
ALTER TABLE actor ADD CONSTRAINT actor_film_fkey FOREIGN KEY (film_id)
REFERENCES film(id);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试添加外键约束时,出现错误:
ERROR: referenced relation "film" is not a table
Run Code Online (Sandbox Code Playgroud)
是否可以向外表添加外键约束?