SQLAlchemy db交互失败取决于我如何运行python脚本
这似乎是我迄今为止处理过的最模糊的问题。我正在努力奋斗 我有一个应用程序,它从一些硬件收集远程数据并将其保存到数据库。我使用SQLAlchemy db交互失败取决于我如何运行python脚本,python,mysql,sqlalchemy,supervisord,alembic,Python,Mysql,Sqlalchemy,Supervisord,Alembic,这似乎是我迄今为止处理过的最模糊的问题。我正在努力奋斗 我有一个应用程序,它从一些硬件收集远程数据并将其保存到数据库。我使用alembic重命名了其中一列。我有一个开发数据库和一个测试数据库。两者都在同一台服务器上(MySQL通过MariaDB在CentOS 7上) 我通过运行在笔记本电脑上的应用程序与开发服务器交互,测试数据库通过运行在生产服务器克隆上的应用程序进行交互 所有服务器和数据库都是使用Ansible设置的,因此差异仅限于用户名和密码 下面是升级脚本中的ansible片段 def u
alembic
重命名了其中一列。我有一个开发数据库和一个测试数据库。两者都在同一台服务器上(MySQL
通过MariaDB
在CentOS 7
上)
我通过运行在笔记本电脑上的应用程序与开发服务器交互,测试数据库通过运行在生产服务器克隆上的应用程序进行交互
所有服务器和数据库都是使用Ansible设置的,因此差异仅限于用户名和密码
下面是升级脚本中的ansible
片段
def upgrade():
op.alter_column('units', 'ip_address', new_column_name='ipv4', existing_type=sa.String(100))
如果我从笔记本电脑(使用IDE)运行应用程序,数据保存正常
如果我在测试服务器上手动运行脚本(env)$python app.py
,则数据保存正常
但是,问题是,如果我使用supervisord
运行脚本,我会得到一个SQLAlchemy错误。(以下摘录)
SQLAlchemy模型
class Unit(Model):
__tablename__ = 'units'
__table_args__ = {'mysql_engine': 'InnoDB'}
id = Column(Integer, Sequence('unit_id_seq'), primary_key=True)
wellsites = relationship('Wellsite', order_by='Wellsite.id', backref='unit')
ipv4 = Column(String(16), unique=True)
...
class Wellsite(Model):
__tablename__ = 'wellsites'
__table_args__ = {'mysql_engine': 'InnoDB'}
id = Column(Integer, Sequence('wellsite_id_seq'), primary_key=True)
unit_id = Column(Integer, ForeignKey('units.id'), nullable=False)
...
etc/supervisord.conf
...
[program:datacollect]
command = /home/webdev/mydevelopment/git/ers_data_app/env/bin/python /home/webdev/mydevelopment/git/ers_data_app/data_monitoring/collection_manager.py
stdout_logfile=/home/webdev/logs/datacollect.log
stderr_logfile=/home/webdev/logs/datacollecterr.log
autostart=true
autorestart=unexpected
startsecs=10
我尝试使用运行另一个alembic
升级
op.create_unique_constraint('uq_ipv4', 'units', ['ipv4'])
没有骰子
除了时间戳之外,回溯
是相同的(使用diff程序)
以下是单位
表的两个数据库描述(相同)
该问题位于
/etc.supervisord.conf
文件的顶部。在其中,设置了一个环境变量,该变量将脚本指向错误的数据库,覆盖了从其他任何地方设置和检查的环境变量。此环境变量仅在从supervisor
运行脚本并导致问题时设置问题位于/etc.supervisord.conf
文件的顶部。在其中,设置了一个环境变量,该变量将脚本指向错误的数据库,覆盖了从其他任何地方设置和检查的环境变量。此环境变量仅在脚本从supervisor
运行并导致故障时设置
op.create_unique_constraint('uq_ipv4', 'units', ['ipv4'])
MariaDB [ers_DEV]> show columns from units;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| unittype_id | int(11) | YES | MUL | NULL | |
| serial | varchar(10) | YES | UNI | NULL | |
| ipv4 | varchar(100) | YES | UNI | NULL | |
| mac_address | varchar(17) | YES | UNI | NULL | |
| engine_hours | int(11) | YES | | NULL | |
| gen_odometer | tinyint(1) | YES | | NULL | |
| gen_periodic | tinyint(1) | YES | | NULL | |
| notes | mediumtext | YES | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
MariaDB [ers_TEST]> show columns from units;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| unittype_id | int(11) | YES | MUL | NULL | |
| serial | varchar(10) | YES | UNI | NULL | |
| ipv4 | varchar(100) | YES | UNI | NULL | |
| mac_address | varchar(17) | YES | UNI | NULL | |
| engine_hours | int(11) | YES | | NULL | |
| notes | mediumtext | YES | | NULL | |
| gen_odometer | tinyint(1) | YES | | NULL | |
| gen_periodic | tinyint(1) | YES | | NULL | |
+--------------+--------------+------+-----+---------+----------------+