我正在寻找创建新SQLAlchemy对象的最快方法,只有在数据库中不存在它时.
我现在这样做的方法是首先获取查询的计数以查看它是否存在,如果不存在 - 然后我创建它.例如:
if not User.query.filter(email=user.email).count():
db.session.add(user)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?会喜欢一些反馈.谢谢!
如果我在我的应用程序中使用以下格式,除PyCharms解析/自动完成功能外,一切正常:
from flask.ext.sqlalchemy import SQLAlchemy
Run Code Online (Sandbox Code Playgroud)
如果我在我的应用程序中使用以下格式,一切正常.但是,唉,这不是导入库的正确方法:
from flask_sqlalchemy import SQLAlchemy
Run Code Online (Sandbox Code Playgroud)
有没有办法让PyCharm正确解析第一个语法?
我一直在使用sqlalchemy.orm中的@validates装饰器来验证字段,只要所有字段彼此独立,所有字段都很顺利,例如:
@validates('field_one')
def validates_field_one(self, key, value):
#field one validation
@validates('field_two')
def validates_field_two(self, key, value):
#field two validation
Run Code Online (Sandbox Code Playgroud)
但是,现在我需要进行一些验证,这需要同时访问field_one和field_two.看起来验证接受验证装饰器的多个参数,但是,它只会为每个参数运行一次验证函数,如下所示:
@validates('field_one', 'field_two')
def validates_fields(self, keys, values):
#field validation
Run Code Online (Sandbox Code Playgroud)
结果验证field_one的工作流程,然后验证field_two.但是,我想同时验证两者(一个简单的例子是断言field_one的值不是field_two的值,其中一个示例是禁止在图中的自循环,其中field_one和field_two引用节点,它正在边缘上执行验证).如何才能成为最佳方式?
我有一个正在运行的Flask应用程序,它是根据我们在网上和Miguel Grinberg的"Flask Web Development"一书中找到的最佳实践组合而建立的.
我们现在需要第二个Python应用程序,它不是Web应用程序,需要访问与Flask应用程序相同的模型.我们想重复使用相同的模型,因此两个应用程序都可以从共享代码中受益.
我们已经删除了对flask-sqlalchemy扩展(我们之前使用过Flask应用程序时)的依赖关系.并将其替换为此处描述的SQLalchemy Declarative扩展,这有点简单(Flask-SQLalchemy为标准SQLAlchemy添加了一些特定的东西)
根据示例,我们在根目录中创建了一个database.py文件.在我们的例子中,有两个与Declarative扩展示例不同的东西:我将引擎和会话放在一个类中,因为我们所有的模型都使用db.session而不是db_session,并且我将带有配置值的字典传递给init( ),以便我可以使用不同的配置从Flask和其他应用程序重新使用此database.py.它看起来像这样:
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
class Database(object):
def __init__(self, cfg):
self.engine = create_engine(cfg['SQLALCHEMY_DATABASE_URI'], convert_unicode=True)
self.session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=self.engine))
class Model(object):
pass
Base = declarative_base()
Run Code Online (Sandbox Code Playgroud)
所以现在我们来解决实际问题.Flask创建一个包含配置选项的类字典对象,并将它们作为属性添加到app-instance.它从实例文件夹,站点根目录中的config.py和环境变量加载它们.我需要从Flask传递配置字典,所以我需要Flask来FIRST加载和组装配置,然后初始化数据库,并在app文件的根目录中有一个(配置的)db对象.但是,我们遵循应用工厂模式,因此我们可以针对不同情况(测试,生产,开发)使用不同的配置.
这意味着我们app/__init__.py看起来像这样(简化):
from flask import Flask
from database import Database
from flask.ext.mail import Mail
from flask_bcrypt import Bcrypt
from config import config …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Flask创建一个简单但非常简单的应用程序,并且我一直遇到文档中没有解释的情况.
我希望我的应用程序可以在不同的模块之间拆分,但看起来很难从主模块以外的任何其他地方访问主app对象(或db来自flask-sqlalchemy).看起来你必须真正编写自己的方式将它视为一切都可以访问的全局,这需要一些有问题的代码和一些时间.
双方app并db在那里的主要应用实例,每个实例假定他们可以在顶级水平的创建.但是如果我将不同的url处理程序拆分成不同的模块,我就失去了使用@app.route装饰器的能力.我可以解决这个问题app.add_url_rule('/...', some.module...),但是再次,app不会传递给该函数.
同样的事情发生在db- 我不知道我是应该坚持下去g,还是通过app某种方式让它可以访问.这样做并没有帮助我将模型移动到一个单独的模块中 - db导入它时我应该如何访问?所有示例再次假设它仅作为局部变量可用.
我错过了一些明显的东西,还是我想在这里使用烧瓶来完成错误的任务?
我想克隆一个sqlalchemy对象:
我试过了
product_obj = products.all()[0] #here products is service name
product_obj.product_uid = 'soemthing' #here product_uid is the pk of product model
products.save(product_obj)
Run Code Online (Sandbox Code Playgroud)
它只是更新old_object
这是products.save函数的代码
class Service(object):
__model__ = None
def save(self, model):
self._isinstance(model)
db.session.add(model)
db.session.commit()
return model
Run Code Online (Sandbox Code Playgroud) 我有一个使用单个mysql服务器的Flask,SQLAlchemy webapp.我想扩展数据库设置以具有只读从属服务器,以便我可以在继续写入主数据库服务器的同时在主服务器和从服务器之间传播读取.
我已经看了几个选项,我相信我不能用简单的SQLAlchemy做到这一点.相反,我计划在我的webapp中创建2个数据库句柄,每个句柄用于主数据库服务器和从数据库服务器.然后使用简单的随机值使用主/从db句柄进行"SELECT"操作.
但是我不确定这是否是使用SQLAlchemy的正确方法.关于如何解决此问题的任何建议/提示?提前致谢.
我似乎无法让我的Flask应用程序关闭或重用数据库连接.我正在使用PostgreSQL 9.1.3和
Flask==0.8
Flask-SQLAlchemy==0.16
psycopg2==2.4.5
Run Code Online (Sandbox Code Playgroud)
当我的测试套件运行时,打开的连接数量会攀升,直到达到20(max_connections设置为止postgresql.conf),然后我看到:
OperationalError: (OperationalError) FATAL: sorry, too many clients already
None None
Run Code Online (Sandbox Code Playgroud)
我已经减少了代码,它只是调用点create_all和drop_all(但不发出任何SQL,因为没有型号).
我在日志中看到要检入的连接:
DEBUG:sqlalchemy.pool.QueuePool:Connection <connection object at 0x101c1dff0; dsn: 'dbname=cx_test host=localhost', closed: 0> checked out from pool
DEBUG:sqlalchemy.pool.QueuePool:Connection <connection object at 0x101c1dff0; dsn: 'dbname=cx_test host=localhost', closed: 0> being returned to pool
WARNING:root:impl <-------- That's the test running
DEBUG:sqlalchemy.pool.QueuePool:Connection <connection object at 0x101c1dff0; dsn: 'dbname=cx_test host=localhost', closed: 0> checked out from pool
DEBUG:sqlalchemy.pool.QueuePool:Connection <connection object at 0x101c1dff0; dsn: …Run Code Online (Sandbox Code Playgroud) 我将我的烧瓶应用程序部署到aws beanstalk并遇到导入错误:
ImportError: No module named flask.ext.sqlalchemy
Run Code Online (Sandbox Code Playgroud)
在我的application.py文件中,我有这个声明
from flask.ext.sqlalchemy import SQLAlchemy
Run Code Online (Sandbox Code Playgroud)
它在我的机器上运行良好,但在aws弹性豆柄中不起作用.
有人遇到过类似的问题吗?
python amazon-web-services flask flask-sqlalchemy amazon-elastic-beanstalk
我在文件中有以下模型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) flask-sqlalchemy ×10
python ×9
flask ×8
sqlalchemy ×6
postgresql ×2
python-2.7 ×2
database ×1
mysql ×1
pycharm ×1
validation ×1