我有3个使用Flask-SQLalchemy创建的模型:User,Role,UserRole
user.py:
class Role( ActiveRecord, db.Model ):
__tablename__ = "roles"
# Schema
id = db.Column( db.Integer, primary_key = True )
name = db.Column( db.String( 24 ), unique = True )
description = db.Column( db.String( 90 ) )
users = db.relationship( "User", secondary = "UserRole", \
backref = db.backref( "roles" ) )
Run Code Online (Sandbox Code Playgroud)
role.py:
class User( db.Model, ActiveRecord ):
__tablename__ = "users"
# Schema
id = db.Column( db.Integer, primary_key = True )
email = db.Column( db.String( 90 ), unique = True ) …Run Code Online (Sandbox Code Playgroud) 我在文件中有以下模型listpull/models.py:
from datetime import datetime
from listpull import db
class Job(db.Model):
id = db.Column(db.Integer, primary_key=True)
list_type_id = db.Column(db.Integer, db.ForeignKey('list_type.id'),
nullable=False)
list_type = db.relationship('ListType',
backref=db.backref('jobs', lazy='dynamic'))
record_count = db.Column(db.Integer, nullable=False)
status = db.Column(db.Integer, nullable=False)
sf_job_id = db.Column(db.Integer, nullable=False)
created_at = db.Column(db.DateTime, nullable=False)
compressed_csv = db.Column(db.LargeBinary)
def __init__(self, list_type, created_at=None):
self.list_type = list_type
if created_at is None:
created_at = datetime.utcnow()
self.created_at = created_at
def __repr__(self):
return '<Job {}>'.format(self.id)
class ListType(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True, nullable=False)
def …Run Code Online (Sandbox Code Playgroud) 我无法让Alembic使用db.Model(Flask-SQLAlchemy)而不是使用(Flask-SQLAlchemy)自动生成从更改到类的候选迁移Base.
我已修改env.py为创建我的Flask应用程序,导入所有相关模型,初始化数据库,然后运行迁移:
...
uri = 'mysql://user:password@host/dbname?charset=utf8'
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = uri
app.config['SQLALCHEMY_ECHO'] = True
db.init_app(app)
with app.test_request_context():
target_metadata = db.Model.metadata
config.set_main_option('sqlalchemy.url', uri)
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
...
Run Code Online (Sandbox Code Playgroud)
这种方法工作正常drop_all(),create_all()(例如,重新创建单元测试的测试分贝时),但似乎在这种情况下落空.自动生成的版本脚本始终具有空的升级和降级方法,例如,
def upgrade():
### commands auto generated by Alembic - please adjust! ###
pass
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
pass
### end Alembic commands ###
Run Code Online (Sandbox Code Playgroud)
我的更改包括重命名列,更改列定义等 …
sqlalchemy database-migration flask flask-sqlalchemy alembic
我在flask-sqlalchemy中有一个典型的帖子/标签(许多标签与一个帖子相关),我想选择没有用我提供的列表中的任何标签标记的帖子.首先,我建立的模型:
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
tags = db.relationship('Tag', lazy='dynamic')
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text(50))
post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
Run Code Online (Sandbox Code Playgroud)
就像是
db.session.query(Post).filter(Post.tags.name.notin_(['dont','want','these']))
失败了
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Post.tags has an attribute 'name'
我假设是因为标签是关系而不是列.当我手动编写实际的SQL时,我在另一个项目上工作.这是有效的SQL:
SELECT * FROM $posts WHERE id NOT IN (SELECT post_id FROM $tags WHERE name IN ('dont','want','these'))
我如何使用sqlalchemy API实现这一目标?
我想声明一个所有其他模式对象都可以继承的基类,例如:
class Base(db.Model):
created_on = db.Column(db.DateTime, default=db.func.now())
updated_on = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
Run Code Online (Sandbox Code Playgroud)
然后所有其他模式对象都可以从它继承而不必重复两列的声明.
我如何在Flask-SQLAlchemy中执行此操作?
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key = True)
email = db.Column(db.String(255), unique = True)
Run Code Online (Sandbox Code Playgroud) TL; DR编辑:我没有设置正确的文件夹权限.
当我运行烧瓶时,一切正常source venv/bin/activate && python run.py.
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, world!"
if __name__ == "__main__":
app.debug = True
app.run(host='0.0.0.0', port=8080)
Run Code Online (Sandbox Code Playgroud)
但是当我使用nginx/emperor.uwsgi运行相同的应用程序时,每次命中服务器都会返回500.如果我注释掉SQLAlchemy导入,那么页面会按预期加载.
根据这个线程我尝试启用lazy/lazy-app,但它没有任何效果.Flask正在引发异常,因此nginx/uwsgi没有记录任何内容.
我尝试过使用from werkzeug.debug import DebuggedApplication但仍然只是在我的浏览器中获得绝对的"内部服务器错误".
配置:
[uwsgi]
uid = http
gid = http
socket = /var/run/project.uwsgi.sock
chown-socket = http
chmod-socket = 664
pidfile = /var/run/project.master.pid
master = true
lazy = true
lazy-apps = true
chdir = /srv/http/project
python-path = …Run Code Online (Sandbox Code Playgroud) 我正在遵循使用 Flask-SQLAlchemy 创建 Flask 应用程序的教程。但是,在创建数据库时它开始引发错误。如何创建数据库?
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///project.db"
db.init_app(app)
from . import models
create_database(app)
return app
def create_database(app):
if not path.exists("website/project.db"):
db.create_all(app=app)
print("created database")
Run Code Online (Sandbox Code Playgroud)
该行db.create_all(app=app)给了我这个错误:
SQLAlchemy.create_all() got an unexpected keyword argument 'app'
Run Code Online (Sandbox Code Playgroud) 我查看了Google Cloud SQL的文档和各种搜索,但我无法确定是否可以将SQLAlchemy与Google Cloud SQL一起使用,如果是,那么连接URI应该是什么.
我想使用Flask-SQLAlchemy扩展,需要连接字符串,如下所示:
mysql://username:password@server/db
我看到了Django示例,但看起来配置使用的风格与连接字符串不同. https://developers.google.com/cloud-sql/docs/django
Google Cloud SQL文档:https: //developers.google.com/cloud-sql/docs/developers_guide_python
python google-app-engine sqlalchemy flask-sqlalchemy google-cloud-sql
我试图Alembic第一次使用,并希望使用此处--autogenerate描述的功能
我的项目结构看起来像
project/
configuration/
__init__.py
dev.py
test.py
core/
app/
models/
__init__.py
user.py
db/
alembic/
versions/
env.py
alembic.ini
Run Code Online (Sandbox Code Playgroud)
我使用Flask,并SQLAlchemy和他们的Flask-SQLAlchemy扩展.我的模特User看起来像
class User(UserMixin, db.Model):
__tablename__ = 'users'
# noinspection PyShadowingBuiltins
uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
unique=True)
email = Column('email', String, nullable=False, unique=True)
_password = Column('password', String, nullable=False)
created_on = Column('created_on', sa.types.DateTime(timezone=True),
default=datetime.utcnow())
last_login = Column('last_login', sa.types.DateTime(timezone=True),
onupdate=datetime.utcnow())
Run Code Online (Sandbox Code Playgroud)
如上所述这里,我修改env.py的样子
from configuration import app
alembic_config = config.get_section(config.config_ini_section) …Run Code Online (Sandbox Code Playgroud) 我希望这里正确使用"类型"这个词.也许我的意思是"论据".随意编辑.
我正在使用带有SQLAlchemy的Flask模型创建数据库,在哪里可以找到所有不同可能的Column参数的列表,例如:
account_id = db.Column(db.Integer, nullable=False)
我知道一些明显的类型,如db.Integer或db.String.但是我似乎无法在SQL Alchemy文档或Flask文档中找到创建db.Column实例的所有可能参数的列表.我看错了吗?
有没有办法区分像db.Integertinyint,bigint等的东西?
至于选项,例如nullable=False,我在创建db.Column实例时找不到所有可能选项的良好列表.
flask-sqlalchemy ×10
python ×8
flask ×7
sqlalchemy ×6
alembic ×2
migration ×1
nginx ×1
uwsgi ×1